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;
阅读全文
0 0
- Android之jni解决JNIEnv跨线程问题
- Android JNI 跨线程使用JniEnv
- Android JNI之JNIEnv
- Android JNI 之 JNIEnv 解析
- Android JNI 之 JNIEnv 解析
- Android JNI 之 JNIEnv 解析
- Android JNI 之 JNIEnv 解析
- jni之JNIEnv*
- 【Android 系统开发】Android JNI 之 JNIEnv 解析
- 【Android 系统开发】Android JNI/NDK (三) 之 JNIEnv 解析
- 【java学习】jni之JNIEnv*
- Android Jni多线程调用JNiEnv
- jni 新线程使用JNIEnv *env
- Java JNI编程之 JNIEnv设计哲学
- 【Android JNI】JNIEnv和JavaVM的区别
- Android之jni出现JNIEnv has no member named 'GetMehtodID'解决办法
- JNI|在子线程中获得JNIEnv|AttachCurrentThread
- JNI|在子线程中获得JNIEnv|AttachCurrentThread
- 文件系统
- 数据结构---线性表基本概念
- hdu 1880
- mount一个目录到另外一个目录
- OpenCV空间滤波
- Android之jni解决JNIEnv跨线程问题
- luogu1613 跑路 题解
- 解决Android中getResources().getColor()方法过时的问题
- bat命令中 rem 和 :: 的区别
- map的一个key多个value
- 【leetcode】125. Valid Palindrome(Python & C++)
- ramfs,tmpfs,rootfs,initramfs和romfs
- sizeof有哪些特点以及sizeof的用法
- Java之IO流