03-01 20:02:47.957 8372-8403/com.lzm.music A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x3c0 in tid 8403 (Thread-6025)

如果对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,就行了.

另外这种报错,也可能是空指针或者索引越界异常.(这一点要注意排除);