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

本文详细解析了在JNI开发中,如何正确处理JNIEnv在不同线程间的使用,避免程序崩溃。通过获取JavaVM实例,创建全局引用,并在异步线程中重新获取JNIEnv,确保线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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等变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值