对AndroidRuntime的一点理解

在Android源码, frameworks/base/core/jni/目录下,有AndroidRuntime的源码,编译后生成libandroid_runtime.so,这个动态库非常重要。

里面含有很多用c++写的jni的方法,这些方法会被虚拟机上层java文件所调用,当我尝试在其中找JNI_OnLoad函数时,却没有找到,通常jni开发时要在动态库中导出这个函数,这样用System.loadLibrary才能通过它来注册jni的方法,于是我的疑惑来了。打开AndroidRuntime.cpp一看,里面有一行:

static const RegJNIRec gRegJNI[] = {

这是一个数组,包含了所有的文件里的jni方法的注册过程,继续找到一行:

if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {

说明register_jni_procs这个函数注册了这个数组里的所有过程。这行语句包含在startReg里,再找到调用它的语句:

    /*
     * Register android functions.
     */
    if (startReg(env) < 0) {
而这就是位于start函数中:

/*
 * Start the Android runtime.  This involves starting the virtual machine
 * and calling the "static void main(String[] args)" method in the class
 * named by "className".
 */
void AndroidRuntime::start(const char* className, const bool startSystemServer)
{

这个函数负责start一个类中的main函数的工作。

我的理解是先启动虚拟机,然后注册jni方法,给要运行的java class作准备,最后才执行java class里的main函数。

应该说libandroid_runtime.so方法不是一个标准的jni库,而是特殊的jni库,它不能在一般的java文件里被通过System.loadLibrary引入,

似乎可以通过davikvm的命令行来调用java类,在java类的文件main函数里动态载入libandroid_runtime.so,然后注册jni方法

这可以通过frameworks/base/core/com/android/internal/util/WithFramework.java来分析

原文地址:https://www.cnblogs.com/qiuchangyong/p/2345996.html