Android之jni解决JNIEnv跨线程问题

来源:互联网 发布:mac dns自动获取 编辑:程序博客网 时间:2024/06/03 11:41

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)     {         goto error;     }     //再获得类中的方法     mid = env->GetMethodID(cls, "fromJNI", "(I)V");     if (mid == NULL)     {         goto error;      }     //最后调用java中的静态方法     env->CallVoidMethod(cls, mid ,(int)arg);error:     return NULL;









原创粉丝点击