JNI env 总结
来源:互联网 发布:美工陈列是做什么 编辑:程序博客网 时间:2024/06/08 18:44
JNIEnv与JavaVM
JNIEnv 概念 : 是一个线程相关的结构体, 该结构体代表了 Java 在本线程的运行环境 ;
JNIEnv 与 JavaVM : 注意区分这两个概念;
-- JavaVM : JavaVM 是 Java虚拟机在 JNI 层的代表, JNI 全局只有一个;
-- JNIEnv : JavaVM 在线程中的代表, 每个线程都有一个, JNI 中可能有很多个 JNIEnv;
JNIEnv 作用 :
-- 调用 Java 函数 : JNIEnv 代表 Java 运行环境, 可以使用 JNIEnv 调用 Java 中的代码;
-- 操作 Java 对象 : Java 对象传入 JNI 层就是 Jobject 对象, 需要使用 JNIEnv 来操作这个 Java 对象;
JNIEnv 体系结构
线程相关 : JNIEnv 是线程相关的, 即 在 每个线程中 都有一个 JNIEnv 指针, 每个JNIEnv 都是线程专有的, 其它线程不能使用本线程中的 JNIEnv, 线程 A 不能调用 线程 B 的 JNIEnv;
JNIEnv 不能跨线程 :
-- 当前线程有效 : JNIEnv 只在当前线程有效, JNIEnv 不能在 线程之间进行传递, 在同一个线程中, 多次调用 JNI层方法, 传入的 JNIEnv 是相同的;
-- 本地方法匹配多JNIEnv : 在 Java 层定义的本地方法, 可以在不同的线程调用, 因此 可以接受不同的 JNIEnv;
JNIEnv 结构 : 由上面的代码可以得出, JNIEnv 是一个指针, 指向一个线程相关的结构, 线程相关结构指向 JNI 函数指针 数组, 这个数组中存放了大量的 JNI 函数指针, 这些指针指向了具体的 JNI 函数;
注意:JNIEnv只在当前线程中有效。本地方法不能将JNIEnv从一个线程传递到另一个线程中。相同的 Java 线程中对本地方法多次调用时,传递给该本地方法的JNIEnv是相同的。但是,一个本地方法可被不同的 Java 线程所调用,因此可以接受不同的 JNIEnv。
1.在JNI_OnLoad中,保存JavaVM*,这是跨线程的,持久有效的,而JNIEnv*则是当前线程有效的。一旦启动线程,用AttachCurrentThread方法获得env。
if (jvm->GetEnv((void **) &menv, JNI_VERSION_1_6) < 0) {//如果getEnv返回值是小于0的 说明没有得到env 一般来说是因为建立了新的线程 需要用下面的命令得到新的env jvm->AttachCurrentThread(&menv, nullptr);}
2.通过JavaVM*和JNIEnv可以查找到jclass。
3.把jclass转成全局引用,使其跨线程。
4.然后就可以正常地调用你想调用的方法了。
5.用完后,别忘了delete掉创建的全局引用和调用DetachCurrentThread方法。
- JNI env 总结
- (*env)->NewStringUTF(env, "Hello from JNI!");env->NewStringUTF("Hello from JNI!");
- jni 新线程使用JNIEnv *env
- env
- env
- env
- env
- JNI调用c/c++,env->和(*env)->是有区别的
- JNI调用c/c++,env->和(*env)->是有区别的
- JNI调用c/c++,env->和(*env)->是有区别的
- [JNI] Android JNI总结
- Jni本地多线程回调Java函数,env->findClass()失败。
- jni调试3(线程调试env变量问题)
- jni调试(线程调试env变量问题)
- JNI总结
- JNI总结
- jni总结
- jni总结
- 最长递增子序列
- PAT程序设计考题——甲级1007 (最大连续子序列和) C++实现
- jquery的使用----$.each(数组/json数据,function (int/key(变量名随意),value(值变量名) ))
- Flask Web开发 第一部分 第5章 数据库
- 第一篇博客
- JNI env 总结
- Android 图形库skia 显示字体
- Centos 7.0 下hadoop集群模式安装(以3个节点为例,master,slave1,slave2)超详细
- ROM、RAM、DRAM、SRAM和FLASH的区别
- 分针网—每日分享:MySQL全文索引应用简明教程
- json前后端处理,避免解析错误问题
- linux在命令行直接打开图形文件夹
- 开启win7家庭普通版的超级管理员账户Administroto
- 【代码笔记】iOS-UIActionSheet动态添加按钮