Android JNI编程如何巧妙获取JNIEnv
Posted mmsx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android JNI编程如何巧妙获取JNIEnv相关的知识,希望对你有一定的参考价值。
1、名词解释
JavaVM:Java虚拟机在Native层的代表,在android中一个进程只有一个JavaVM,所有的线程共用一个JavaVM。
JNIEnv:Java调用Native语言的环境,是一个封装了几乎所有JNI方法的指针,每一个Java线程都有一个对应的JNIEnv,JNIEnv只在当前线程可用,不能跨线程使用,不同线程的JNIEnv彼此独立。在Native环境中创建的线程,如果需要调用JNI方法,必须要调用AttachCurrentThread()与JVM进行关联,使用后也需要调用DetachCurrentThread()来解除关联。
2、使用JavaVM和JNIEnv
所以在Android Java层只需要调用
System.loadLibrary(xxx);
你在c++或者c代码可以复写这个函数,获取JavaVM 和 JNIEnv句柄,不要Java上层传入句柄。
调用loadLibrary加载库的时候,会自动调用下面这个函数。
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
global_jvm = vm;
}
3、结构体定义的位置
这两个结构体都在JNI.h头文件里面,JNI.h是在ndk-bundle文件夹下面的某个文件夹下面的文件。
如果你的项目有配置ndk,双击shift键搜索JNI.h文件,可以自已查看相关详细的结构体定义,超级长,超级多。
以上是关于Android JNI编程如何巧妙获取JNIEnv的主要内容,如果未能解决你的问题,请参考以下文章