Jimmy Chen

A Programmer

(原创)基于Android R之ART虚拟机JNIEnvExt类介绍

  说到JNIEnvExt这个类,其实是和JavaVMExt类似的,JavaVMExt是从JavaVM继承而来,而JNIEnvExt类则是从JNIEnv继承而来,类关系图和JavaVMExt也是类似的,下面我们直接从JNIEnv定义开始,下面所有分析的代码都是基于Android11_R17进行分析。

JNIEnv定义

JavaVMExt中的JNIInvokeInterface就有点类似了,JNIEnvExt则是使用了JNINativeInterface,下面我们看看JNINativeInterface里面的具体内容

JNINativeInterface中定义的方法非常多,我们这里挑了一小部分出来,NewGlobalRefDeleteGlobalRef这类方法是否有些似曾相识呢?这些方法在JNI编程的时候也会经常用到,其实就是在这里定义的。

JNIEnvExt创建过程

  JNIEnvExt的创建过程也和JavaVMExt类似,最开始调用JNIEnvExt::Create进行JNIEnvExt进行创建

关键地方也是调用new JNIEnvExt

接下来,我们看下开启check_jni_和未开启check_jni_的赋值情况

如果启用了JNI检查,那么调用的是GetCheckJniNativeInterface,否则就是GetJniNativeInterface

JavaVMExt类似,放个结构体指针,启用JNI检查,指向gCheckNativeInterface,否则指向gJniNativeInterface

JNIEnvExt的相关类的关系也是比较简单,这里先留个记忆,后面有遇到类似的需求再对细节进行拆解分析。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注