Android之jni解决JNIEnv跨线程问题

举报
chenyu 发表于 2021/07/27 00:57:16 2021/07/27
【摘要】 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文件

   
  1. JavaVM *g_jvm = NULL;
  2. jobject g_obj = NULL;
  3. //由java调用来建立JNI环境
  4. JNIEXPORT void Java_****_setJNIEnv( JNIEnv* env, jobject obj)
  5. {
  6. //保存全局JVM以便在子线程中使用
  7. env->GetJavaVM(&g_jvm);
  8. //不能直接赋值(g_obj = obj)
  9. g_obj = env->NewGlobalRef(obj);
  10. }
  11. //线程里面
  12. JNIEnv *env;
  13. jclass cls;
  14. jmethodID mid;
  15. //Attach主线程
  16. if(g_jvm->AttachCurrentThread(&env, NULL) != JNI_OK)
  17. {
  18. return NULL;
  19. }
  20. //找到对应的类
  21. cls = env->GetObjectClass(g_obj);
  22. if(cls == NULL)
  23. {
  24. go

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/78066746

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。