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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值