Android开发过程中问题日志及解决方法

1.在JNI开发中,在与jni方法异步线程中使用JNIEnv相关方法导致程序native崩溃。

原因:
JNIEnv是一个线程相关的变量;JNIEnv 对于每个 thread 而言是唯一的 ;JNIEnv *env指针不可以为多个线程共用。

解决方法:

//全局声明
	JavaVM *jvm;
	jobject javaobj;
//在jni方法中
	(*env)->GetJavaVM(env, &jvm);  //获取JavaVM实例
	javaobj =(*env)->New[Weak]GlobalRef(env, obj);  //创建jobj的全局引用
//在其他线程中
	JNIEnv *env;
	(*jvm)->AttachCurrentThread(jvm,&env,NULL);
//然后可以使用相关JNIEnv方法

1.在jni方法实现中获取JavaVM实例(在jni线程中),例如JavaVM *jvm = (*env)->GetJavaVM(env, &jvm);
2.对jni相关的变量进行全局引用(在jni线程中),如jobject javaobj = (*env)->New[Weak]GlobalRef(env, obj);
3.在其他线程中获取JNIENV实例, (*jvm)->AttachCurrentThread(jvm,&env,NULL);
4.在该线程可以调用JNIEnv和其他全局引用的jobject等变量。

你可能感兴趣的:(Android)