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文件,可以自已查看相关详细的结构体定义,超级长,超级多。

参考链接:https://cloud.tencent.com/developer/article/1650769

以上是关于Android JNI编程如何巧妙获取JNIEnv的主要内容,如果未能解决你的问题,请参考以下文章

Android JNI编程如何巧妙获取JNIEnv

Android JNI编程如何巧妙获取JNIEnv

Android JNI详解

Android 系统开发Android JNI 之 JNIEnv 解析

Android深入理解JNI类型转换方法签名和JNIEnv

如何在JNI中抛异常