Jimmy Chen

A Programmer

(原创)基于Android R之ART虚拟机的JavaVmExt类和InitNativeMethods方法介绍

  这一篇是紧接着上一篇《(原创)基于Android R之ART虚拟机的创建流程》遗留的一些问题做进一步分析。上一篇我们遗留了两个内容,一个是JavaVmExt类,另一个则是InitNativeMethods方法的实现没有做进一步的分析。这篇我们接着对这两个部分做进一步分析,下面所有分析的代码都是基于Android11_R17进行分析。

JavaVmExt类

  JavaVmExt类总体比较简单,JavaVmExt类是继承JavaVM类,并再次基础上再额外实现了一部分方法。在做进一步分析前,有必要先将JavaVmExt的类关系图画一画,类关系图如下:

《(原创)基于Android R之ART虚拟机的JavaVmExt类和InitNativeMethods方法介绍》

  • 从图中可以了解到,通过typedef,JavaVM实际上就是_JavaVM
  • JavaVmExt类是继承JavaVM类而来的
  • _JavaVM的第一个结构体需要指向JNIInvokeInterface,JNIInvokeInterface定义如下,在其中提供了一些控制JavaVM状态的方法

回想上一篇,我们如果要创建JavaVM的话是通过调用JavaVmExt::Create方法的,

如上所说,Android R上已无法通过new JavaVMExt的方式直接创建JavaVM,下面我们看看JavaVMExt的构造方法,我们重点关注基类JavaVM中的functions赋值情况,其余部分暂时忽略

在方法的初始化列表中,首先会将gJniInvokeInterface赋值给unchecked_functions_。而在方法体内,首先会再将unchecked_functions_赋值给functions。同时要注意SetCheckJniEnabled内部也有一个判断和赋值的过程:

上述代码中首先判断check_jni_是否为true,如果为true的话就调用GetCheckJniInvokeInterface,该方法内部会返回gCheckInvokeInterface。我们将gJniInvokeInterfacegCheckInvokeInterface两个指向的方法对比如下

上述总结起来就是

  • functions_是JavaVMExt基类JavaVM的第一个成员变量,类型为JNIInvokeInterface。而unchecked_functions_是JavaVMExt的成员变量,数据类型也是JNIInvokeInterface,两者的作用稍有区别
  • 如果不启用jni检查的话,这两个成员变量都指向gJniInvokeInterface
  • 如果启用了jni检查的话,这两个成员变量就指向不同的JNIInvokeInterface成员变量的了。其中unchecked_functions_代表无需jni检查的对象,而functions_代表需要jni检查的对象。此时会先调用functions_中的启用JNI检查的方法,这部分方法调用完后会再次调用unchecked_functions_的方法进行实际的操作

JavaVMExt的内容相对简单,就分析到这里。

InitNativeMethods

InitNativeMethods方法的作用就是用于注册运行时会用的到的native 方法,并且加载三个关键的so库,其中就有openjdk环境。接下来简单看下RegisterRuntimeNativeMethods

从上方法体可以看出,开始加载一部分ART虚拟机使用到的native方法,下面注册的是java运行环境中会用到的native方法。我们可以挑其中一个看,这里选择register_dalvik_system_DexFile

register_dalvik_system_DexFile

写过JNI方法的同学这里就比较容易理解了,这里就是注册了与上次Java的native方法,当上层Java调用到native定义的方法是,就会通过JNI调用到这里。各个方法的具体实现这里就不多做分析,有兴趣的同学可以选择一两个来查看

好的,这篇就到这里,不过又得留个坑,这里我们看到有涉及JNIEnv这个对象,那么这个JNIEnv对象又是什么东西,提供什么内容呢?我们下一篇见咯

发表回复

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