zoukankan      html  css  js  c++  java
  • 对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来分析

  • 相关阅读:
    Poj3295 tautology
    Poj2586 每五个月都是亏
    Poj 2109 k^n = p.
    Poj2109 (2) k^n = p.
    Poj2109 (1) k^n = p.
    Poj2965 冰箱的开关
    Poj1328 用雷达覆盖所有的岛屿
    FASTER-RCNN
    卷积、池化计算
    理论感受野的计算
  • 原文地址:https://www.cnblogs.com/qiuchangyong/p/2345996.html
Copyright © 2011-2022 走看看