JNI中Fatal signal 11 (SIGSEGV), code 1的错误.
这个错,搞了一天才搞定.还是自己对jni不熟.
com.viking.myapplication A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x9c in tid 9502 (g.myapplication).
如果对jni熟悉的话,可能很快就能知道这个错误.但是,如何是刚开始搞jni开发的人来说,可能就一脸懵比了.
这啥玩意啊.
网上搜了很多资料,基本上都是说什么,c代码中存在空指针异常,或者索引越界异常. 反正就是说内存的问题.
在一次无意中搜到tid这个词,thread ID,线程ID? 根据这个思路, 然后一搜,才发现原来,JNIEnv*env 是一个线程对应一个env,线程间不可以共享同一个env变量。
1.首先C代码添加全局变量
JavaVM * vm; //创建javavm的全局变量
2.通过env->GetJavaVM(&vm);来获取javavm指针,保存到vm中. env是当前线程的变量.
3.在新线程中:
JNIEnv *env;
vm->AttachCurrentThread(&env,NULL); //通过vm给env赋值
4.这样在子线程中用env,就行了.
代码:
<1.C主线程初始化
jclass jjnimethodclass; jobject jjnimethodjobject; JavaVM *g_vm = NULL; jmethodID jmethod; jclass jimageuserinfoclazz; jclass jpicinfoclazz ; jmethodID jimageuserinfoID; jmethodID jpicinfoID; jmethodID jregmethod;
JNIEXPORT jint JNICALL Java_com_viking_myapplication_JniMethod_NetInit(JNIEnv *env, jobject jobj){ jjnimethodclass = env->GetObjectClass(jobj); jjnimethodjobject = (jobject)env->NewGlobalRef(jobj); env->GetJavaVM(&g_vm); jclass jimageus = env->FindClass("com/viking/bean/TImageUserInfo"); jclass jpicinfo = env->FindClass("com/viking/bean/TPicInfo"); jimageuserinfoclazz = (jclass)env->NewGlobalRef(jimageus); jpicinfoclazz = (jclass)env->NewGlobalRef(jpicinfo); jimageuserinfoID = env->GetMethodID(jimageuserinfoclazz,"<init>","()V"); jpicinfoID = env->GetMethodID(jpicinfoclazz,"<init>","()V"); jregmethod = env->GetMethodID(jjnimethodclass,"NetRegImageRecvExCallBack","(IILcom/viking/bean/TImageUserInfo;Lcom/viking/bean/TPicInfo;)V"); }
<2.回调函数,C辅助线程回调.
int GetImageCbEx(DCHANDLE tHandle, unsigned int uiImageId, T_ImageUserInfo *ptImageInfo,T_PicInfo *ptPicInfo,void *pUser){LOGE("GetImageCbEx:回调");JNIEnv *env2;//g_vm->AttachCurrentThread(&env2, NULL); bool ret = false;if(g_vm != NULL) {JavaVMAttachArgs vmAttachArgs;vmAttachArgs.version = JNI_VERSION_1_6;vmAttachArgs.name = NULL;vmAttachArgs.group = NULL;jint attachRet = g_vm->AttachCurrentThread(&env2, &vmAttachArgs);if(attachRet == 0) {ret = true;} else{LOGE("attachRet != 0");ret = false;}} else{LOGE("g_vm == NULL");ret = false;}if (ret){//创建两个对象 jobject jimageuserinfoobj = env2->NewObject(jimageuserinfoclazz,jimageuserinfoID);jobject jpicinfoobj = env2->NewObject(jpicinfoclazz,jpicinfoID);jfieldID usWidthID = env2->GetFieldID(jimageuserinfoclazz,"usWidth","S");env2->SetShortField(jimageuserinfoobj,usWidthID,ptImageInfo->usWidth);jfieldID usHeightID = env2->GetFieldID(jimageuserinfoclazz,"usHeight","S");env2->SetShortField(jimageuserinfoobj,usHeightID,ptImageInfo->usHeight);jfieldID ucVehicleColorID = env2->GetFieldID(jimageuserinfoclazz,"ucVehicleColor","B");env2->SetByteField(jimageuserinfoobj,ucVehicleColorID,ptImageInfo->ucVehicleColor);jfieldID ucVehicleBrandID = env2->GetFieldID(jimageuserinfoclazz,"ucVehicleBrand","B");env2->SetByteField(jimageuserinfoobj,ucVehicleBrandID,ptImageInfo->ucVehicleBrand);jfieldID ucVehicleSizeID = env2->GetFieldID(jimageuserinfoclazz,"ucVehicleSize","B");env2->SetByteField(jimageuserinfoobj,ucVehicleSizeID,ptImageInfo->ucVehicleSize);jfieldID ucPlateColorID = env2->GetFieldID(jimageuserinfoclazz,"ucPlateColor","B");env2->SetByteField(jimageuserinfoobj,ucPlateColorID,ptImageInfo->ucPlateColor);jfieldID szLprResult16ID = env2->GetFieldID(jimageuserinfoclazz,"szLprResult16","[B");jbyteArray szlprresult16arr = env2->NewByteArray(16);jbyte *szlp = (jbyte*)(ptImageInfo->szLprResult);env2->SetByteArrayRegion(szlprresult16arr,0,16,szlp);env2->SetObjectField(jimageuserinfoobj,szLprResult16ID,szlprresult16arr);jfieldID usLpBox4ID = env2->GetFieldID(jimageuserinfoclazz,"usLpBox4","[S");jshortArray uslpbox4arr = env2->NewShortArray(4);jshort* uslp = (jshort*)(ptImageInfo->usLpBox);env2->SetShortArrayRegion(uslpbox4arr,0,4,uslp);env2->SetObjectField(jimageuserinfoobj,usLpBox4ID,uslpbox4arr);jfieldID ucLprTypeID = env2->GetFieldID(jimageuserinfoclazz,"ucLprType","B");env2->SetByteField(jimageuserinfoobj,ucLprTypeID,ptImageInfo->ucLprType);jfieldID usSpeedID = env2->GetFieldID(jimageuserinfoclazz,"usSpeed","S");env2->SetShortField(jimageuserinfoobj,usSpeedID,ptImageInfo->usSpeed);jfieldID ucSnapTypeID = env2->GetFieldID(jimageuserinfoclazz,"ucSnapType","B");env2->SetByteField(jimageuserinfoobj,ucSnapTypeID,ptImageInfo->ucSnapType);jfieldID ucReservedID = env2->GetFieldID(jimageuserinfoclazz,"ucReserved","B");env2->SetByteField(jimageuserinfoobj,ucReservedID,ptImageInfo->ucReserved);jfieldID acSnapTime18ID = env2->GetFieldID(jimageuserinfoclazz,"acSnapTime18","[B");jbyteArray acsnaptime18arr = env2->NewByteArray(18);jbyte* acsna = (jbyte*)(ptImageInfo->acSnapTime);env2->SetByteArrayRegion(acsnaptime18arr,0,18,acsna);env2->SetObjectField(jimageuserinfoobj,acSnapTime18ID,acsnaptime18arr);jfieldID ucViolateCodeID = env2->GetFieldID(jimageuserinfoclazz,"ucViolateCode","B");env2->SetByteField(jimageuserinfoobj,ucViolateCodeID,ptImageInfo->ucViolateCode);jfieldID ucLaneNoID = env2->GetFieldID(jimageuserinfoclazz,"ucLaneNo","B");env2->SetByteField(jimageuserinfoobj,ucLaneNoID,ptImageInfo->ucLaneNo);jfieldID uiVehicleIdID = env2->GetFieldID(jimageuserinfoclazz,"uiVehicleId","I");env2->SetIntField(jimageuserinfoobj,uiVehicleIdID,ptImageInfo->uiVehicleId);jfieldID ucScoreID = env2->GetFieldID(jimageuserinfoclazz,"ucScore","B");env2->SetByteField(jimageuserinfoobj,ucScoreID,ptImageInfo->ucScore);jfieldID ucDirectionID = env2->GetFieldID(jimageuserinfoclazz,"ucDirection","B");env2->SetByteField(jimageuserinfoobj,ucDirectionID,ptImageInfo->ucDirection);jfieldID ucTotalNumID = env2->GetFieldID(jimageuserinfoclazz,"ucTotalNum","B");env2->SetByteField(jimageuserinfoobj,ucTotalNumID,ptImageInfo->ucTotalNum);jfieldID ucSnapshotIndexID = env2->GetFieldID(jimageuserinfoclazz,"ucSnapshotIndex","B");env2->SetByteField(jimageuserinfoobj,ucSnapshotIndexID,ptImageInfo->ucSnapshotIndex);//对象二 jfieldID uiPanoramaPicLenID = env2->GetFieldID(jpicinfoclazz,"uiPanoramaPicLen","I");jint len1 = ptPicInfo->uiPanoramaPicLen;env2->SetIntField(jpicinfoobj,uiPanoramaPicLenID,ptPicInfo->uiPanoramaPicLen);jfieldID uiVehiclePicLenID = env2->GetFieldID(jpicinfoclazz,"uiVehiclePicLen","I");jint len2 = ptPicInfo->uiVehiclePicLen;env2->SetIntField(jpicinfoobj,uiVehiclePicLenID,ptPicInfo->uiVehiclePicLen);jfieldID ptPanoramaPicBuffID = env2->GetFieldID(jpicinfoclazz,"ptPanoramaPicBuff","[B");jbyteArray ptpanoramapicbuffstrarr = env2->NewByteArray(len1);jbyte * ptpan = (jbyte*)(ptPicInfo->ptPanoramaPicBuff);env2->SetByteArrayRegion(ptpanoramapicbuffstrarr,0,len1,ptpan);env2->SetObjectField(jpicinfoobj,ptPanoramaPicBuffID,ptpanoramapicbuffstrarr);jfieldID ptVehiclePicBuffID = env2->GetFieldID(jpicinfoclazz,"ptVehiclePicBuff","[B");jbyteArray ptvehiclepicbuffarr = env2->NewByteArray(len2);jbyte* ptveh = (jbyte*)(ptPicInfo->ptVehiclePicBuff);env2->SetByteArrayRegion(ptvehiclepicbuffarr,0,len2,ptveh);env2->SetObjectField(jpicinfoobj,ptVehiclePicBuffID,ptvehiclepicbuffarr);jstring puser = env2->NewStringUTF((char*)pUser);env2->CallVoidMethod(jjnimethodjobject,jregmethod,tHandle,uiImageId,jimageuserinfoobj,jpicinfoobj);g_vm->DetachCurrentThread();} else{LOGE("GetImageCbEx 回调失败.");}return 0; }
<3.注册回调函数
//图片抓拍注册回调接口 1 JNIEXPORT jint JNICALL Java_com_viking_myapplication_JniMethod_NetRegImageRecvEx(JNIEnv *env, jobject jobj, jint tHandle, jstring pUser){ LOGE("Java_com_viking_myapplication_JniMethod_NetRegImageRecvEx"); char *puser = (char*)env->GetStringUTFChars(pUser,0); return Net_RegImageRecvEx(tHandle, GetImageCbEx,(void*)puser); }
<4.回调方法
JNIEXPORT jint JNICALL Java_com_viking_myapplication_JniMethod_NetImageSnap(JNIEnv *env, jobject jobj, jint tHandle,jobject ptImageSnap){LOGE("Java_com_viking_myapplication_JniMethod_NetImageSnap");jclass tmp = env->GetObjectClass(jobj);jregimageexclass = (jclass)env->NewGlobalRef(tmp);jregimageexobject = (jobject)env->NewGlobalRef(jobj); T_DCImageSnap t_dcImageSnap;jclass jclazz = env->GetObjectClass(ptImageSnap);jfieldID uiImageIdID = env->GetFieldID(jclazz,"uiImageId","I");t_dcImageSnap.uiImageId = (unsigned int)env->GetIntField(ptImageSnap,uiImageIdID);jfieldID ucLightIndexID =env->GetFieldID(jclazz,"ucLightIndex","B");t_dcImageSnap.ucLightIndex = (unsigned char)env->GetByteField(ptImageSnap,ucLightIndexID);jfieldID ucLightModeID =env->GetFieldID(jclazz,"ucLightMode","B");t_dcImageSnap.ucLightMode =(unsigned char)env->GetByteField(ptImageSnap,ucLightModeID);jfieldID usGroupIdID =env->GetFieldID(jclazz,"usGroupId","S");t_dcImageSnap.usGroupId =(unsigned short)env->GetShortField(ptImageSnap,usGroupIdID);jint result =Net_ImageSnap(tHandle,&t_dcImageSnap);return result; }
另外这种报错,也可能是空指针或者索引越界异常.(这一点要注意排除);
JNI中Fatal signal 11 (SIGSEGV), code 1的错误.相关推荐
- Fatal signal 11 (SIGSEGV), code 1, fault addr 0x10457e30d996b in tid 5676 (ndroid.settings)
FROM:http://blogold.chinaunix.net/u3/104564/showart_2091186.html 一.安装交叉编译器 1)交叉编译器使用CodeSourcery提供的 ...
- cn.sample.mnn.detect A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid
mnn报错: cn.sample.mnn.detect A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 ...
- JNI:Fatal signal 11 (SIGSEGV) at 0x00000008 (code=1)错误的一点认识
最近做的一个东西需要jni去实现,对于一个我这样用惯了java,习惯了debug的人来说,用NDK,使用C/C++去编程是件很苦逼的事情,但是最苦逼的事情在于内存错误发生后如何排查,尤其是 Fatal ...
- A/libc:fatal signal 11(SIGSEGV).code 1, fault addr 0x0 in tid 26488 (VideoEncoder)
在调试Camera模块:发现相同的代码在厂家提供的环境里边编译.就是ok的,在我们的源码树中编译,将HAL库推进去后.就会signal 11退出. 一.现象 1 F/libc ( 4250): Fat ...
- Android rom开发:app运行异常,报libc: Fatal signal 11 (SIGSEGV) in tid xxx错误
最近遇到了app在设备上反复挂掉的问题.log如下: 2020-03-07 13:20:24.814 16858-16858/? E/SharedPreferencesImpl: Couldn't c ...
- JNI 编码中遇到 Fatal signal 11 (SIGSEGV)查看报错日志
2022-09-14 09:19:01.092 3562-3580/com.derry.opengl A/libc: Fatal signal 11 (SIGSEGV), code 1, fault ...
- 集成百度ORC 识别报 Fatal signal 11 (SIGSEGV) (RenderThread) 错误(已解决)
错误日志: 09-17 16:34:14.052 1422-1519/com.dcqtech.syl A/libc: Fatal signal 11 (SIGSEGV), code 1, fault ...
- Android 10 SurfaceView 奔溃报错signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4
最近在Android 10 系统上发现SurfaceView 测试的时候奔溃了,10以前的系统测试都会奔溃,在Android 11之后的设备上是正常的. 上错误日志 Native 报错信息 signa ...
- Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)问题解决
Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)问题解决 参考文章: (1)Fatal signal 11 (SIGSEGV) at 0x0000000 ...
最新文章
- Python自动化办公之Excel拆分并自动发邮件
- php基础遍历,php 数据遍历
- linux临时启动进程命令,Linux常用命令(一)服务控制及优化启动过程
- 页表长度和页表大小_在请求调页系统中,若逻辑地址中的页号超过页表控制寄存器中的页表长度,则会引起( ) 。_学小易找答案...
- 天津市全国计算机等级报名时间,天津市2018年全国计算机等级考试报名时间及地点...
- 【oracle ocp知识点一】
- JAVASE学习总结(20):字符串相关的类--StringBuffer
- 计算机硬件 试题库,计算机硬件维护-试题库
- 2020年计算机设计大赛参赛回顾与总结
- unity粒子特效-实现下雨效果
- C语言求两点之间的距离程序,C语言求空间两点之间的距离
- android图片按比例缩放,Android开发之imageView图片按比例缩放的实现方法
- 一个简洁、美观的登录页面
- 数据库复杂查询,左联右联 聚合 计数 时间查询等,持续更新
- 微信营销解密个人分析
- 什么蓝牙耳机好用又不贵?好用不贵的蓝牙耳机推荐
- Python基础之Flask快速入门2
- 图南淘宝开网店运营培训电商课程之学历分析
- 非机动车检测数据集(用于训练目标跟踪)
- Redis 配置不当致使 root 被提权漏洞