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来分析

  • 相关阅读:
    一些零碎小知识点积累随笔
    STM32学习笔记——新建工程模板步骤(向原子哥学习)
    记一次电信反射xss的挖掘与利用
    mysql字符串操作相关函数用法总结
    mysql学习笔记
    sigmoid function的直观解释
    多变量线性回归时使用梯度下降(Gradient Descent)求最小值的注意事项
    SAE中Python无法创建多线程的解决方案
    BCNF/3NF 数据库设计范式简介
    web.py下获取get参数
  • 原文地址:https://www.cnblogs.com/qiuchangyong/p/2345996.html
Copyright © 2011-2022 走看看