当前位置:网站首页>程序运行问题排查和解决:an instance of ‘std::logic_error‘what(): basic_string::_M_construct null not valid
程序运行问题排查和解决:an instance of ‘std::logic_error‘what(): basic_string::_M_construct null not valid
2022-07-15 13:58:00 【nanke_yh】
报错:
terminate called after throwing an instance of 'std::logic_error'what(): basic_string::_M_construct null not valid
java程序调用jni接口运行服务,访问就会崩溃,idea报错如上,浏览器中则是无响应,且是跨域报错(这是服务停止无法请求导致的)。多次尝试后无果,逐一排查问题。
检查java程序和接口,没有错误,然后排查jni层代码,注掉jni调用c++层的接口,发现仍然有问题,那么问题应该是出在jni层。再逐步排查发现是jstring参数解析过程出现的问题。
解决问题:
由于需要,传入了jstring参数,参数可以为空可以有数据内容,参数在jni层解析转为string传入C代码,在C代码中判断处理。这里设计的参数为空传入形式可以是info=null;或者info=“”;为此在传入“”后出现了上述报错导致程序无法运行的情况。
jni层中使用的jstring2string函数为:
string jstring2string(JNIEnv *env, jstring jstr)//若jstr为“”时报错
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("GB2312");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if(alen>0)
{
rtn = (char*)malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr,ba,0);
string stemp(rtn);
free(rtn);
return stemp;
}不难发现其中的原因:调用的jstring2string函数,传入空值"",alen=0,未处理却直接释放了相关内存,返回的也是坏内存,就会导致内存异常报错。
需要考虑到jstr=“”的情况,修改代码有:
string jstring2string(JNIEnv *env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("GB2312");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if(alen>0)
{
rtn = (char*)malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
else
{
env->ReleaseByteArrayElements(barr,ba,0);
return "";
}
env->ReleaseByteArrayElements(barr,ba,0);
string stemp(rtn);
free(rtn);
return stemp;
}修改后再运行程序测试就能够正常运行没有报错了,那么这个问题就解决了。
边栏推荐
- Machine learning - matrix derivation basic formula + common formula
- Among the top 50 intelligent operation and maintenance enterprises in 2022, Borui data strength was selected
- Flowable query the current user's to-do task method and report an error
- Mysql8.0 learning records 18 - tablespaces
- DAY_4作业——判断数组内是否有某一个数据————实现数组映射(放大 10 倍)—— 实现按序插入数组(修改bug)——实现数组去重
- 源码中的modCount是什么?有什么作用
- Creative ribbon style landing page
- JVM garbage collection -- how to determine whether an object is garbage
- 进程间通信——共享内存
- Technology sharing | packet capturing analysis TCP protocol
猜你喜欢
随机推荐
Blue Bridge Cup VIP question bank
关于Anaconda的一些操作(安装软件和快速打开)
100行以上就应该拆成函数
备忘录模式 - Unity
面上大厂需要准备的面试题
《天天数学》连载60:二月二十九日
Fade the background registration + login form page
flink的yarn集群方式(2)
怎么学习Object.defineProperty | 一篇文章带你们快速学会
js看图猜水果蔬菜小游戏代码
Good news | the scores of candidates in this area can be queried
The relationship between reinforcement learning (Q-learning) and path search (a*)
从源码学习线程池的使用原理及核心思想解析
101. (cesium chapter) cesium particle system - snow
DPU — 完全可编程网络
开源数据质量解决方案——Apache Griffin入门宝典
OpenAI发文介绍Dall·E 2最新应用情况:全面进入艺术创作和设计领域
【第二十三题】带旋转的数独游戏|dfs(北理工/北京理工大学/程序设计方法与实践/小学期 )
Mysql8.0 learning records 18 - tablespaces
如何使用Fiddler进行弱网测试








