Android之jni解决JNIEnv跨线程问题
【摘要】 1、问题
JNIEnv是一个线程相关的变量
JNIEnv 对于每个 thread 而言是唯一的
JNIEnv *env指针不可以为多个线程共用
2、解决办法
java虚拟机的JavaVM指针是整个jvm公用的,我们...
1、问题
JNIEnv是一个线程相关的变量
JNIEnv 对于每个 thread 而言是唯一的
JNIEnv *env指针不可以为多个线程共用
2、解决办法
java虚拟机的JavaVM指针是整个jvm公用的,我们可以用JavaVM来得到当前线程的JNIEnv指针,可以使用javaAttachThread保证取得当前线程的Jni环境变量
下面的写法是cpp文件
-
JavaVM *g_jvm = NULL;
-
jobject g_obj = NULL;
-
//由java调用来建立JNI环境
-
JNIEXPORT void Java_****_setJNIEnv( JNIEnv* env, jobject obj)
-
{
-
//保存全局JVM以便在子线程中使用
-
env->GetJavaVM(&g_jvm);
-
//不能直接赋值(g_obj = obj)
-
g_obj = env->NewGlobalRef(obj);
-
}
-
//线程里面
-
JNIEnv *env;
-
jclass cls;
-
jmethodID mid;
-
-
//Attach主线程
-
if(g_jvm->AttachCurrentThread(&env, NULL) != JNI_OK)
-
{
-
return NULL;
-
}
-
//找到对应的类
-
cls = env->GetObjectClass(g_obj);
-
if(cls == NULL)
-
{
-
go
文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。
原文链接:chenyu.blog.csdn.net/article/details/78066746
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)