对AndroidRuntime的一点理解
来源:互联网 发布:澳洲网络 编辑:程序博客网 时间:2024/05/14 05:09
在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来分析
- 对AndroidRuntime的一点理解
- 对ActiveX的一点理解
- 对inherited的一点理解
- 对管理信息系统的一点理解
- 对主力的一点理解
- 对HANDLE_MSG()的一点理解
- 对__threadfence的一点理解
- 对makefile的一点理解
- 对ibatis的一点理解
- 对中断的一点理解
- 对Zigbee的一点理解
- 对HANDLE_MSG()的一点理解
- 对软件工程的一点理解
- 对.Class的一点理解
- 对static的一点理解
- 对Struts2的一点理解
- 对AJAX的一点理解
- 对Fragment的一点理解
- JSTL标签
- 返回json格式数据的api提供网站
- 预编译与条件编译
- zoj1090
- SQL中 EXISTS 的用法简介
- 对AndroidRuntime的一点理解
- C语言32大关键字
- 论缓存之第一<道>
- /sys/class/gpio 文件接口操作IO端口(s3c2440)
- <s:property> 标签的escape="false"属性
- 数据结构(五) --- 链表
- yum源安装soft
- kilu.de超大的10G德国免费空间
- Ubuntu下WxPython安装