【分析】dalvik虚拟机启动过程(三)

源码版本:Android-4.4.4_r2

提示:大部分分析直接注释在代码内。

相关文章:

【分析】dalvik虚拟机启动过程(一)

【分析】dalvik虚拟机启动过程(二)



AndroidRuntime::start中调用AndroidRuntime::startVm函数启动了虚拟机,然后又调用了AndroidRuntime::startReg函数注册Android函数:

/*
 * 向 VM 注册Android本地函数。
 * Register android native functions with the VM.
 */
/*static*/ int AndroidRuntime::startReg(JNIEnv* env)
{
    // 这个函数还不知道是干嘛的!
    /*
     * This hook causes all future threads created in this process to be
     * attached to the JavaVM.  (This needs to go away in favor of JNI
     * Attach calls.)
     */
    androidSetCreateThreadFunc((android_create_thread_fn) javaCreateThreadEtc);

    ALOGV("--- registering native functions ---\n");

    /*
     * Every "register" function calls one or more things that return
     * a local reference (e.g. FindClass).  Because we haven't really
     * started the VM yet, they're all getting stored in the base frame
     * and never released.  Use Push/Pop to manage the storage.
     */
    env->PushLocalFrame(200);

    // gRegJNI是一个函数列表,这些函数会注册一些本地函数。
    if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {
        env->PopLocalFrame(NULL);
        return -1;
    }
    env->PopLocalFrame(NULL);

    //createJavaThread("fubar", quickTest, (void*) "hello");

    return 0;
}

gRegJNI:

static const RegJNIRec gRegJNI[] = {
    ......
    REG_JNI(register_android_util_Log),
    ......
};

REG_JNI(register_android_util_Log)来说,函数register_jni_procs会调用register_android_util_Log

/*
 * JNI registration.
 */
static JNINativeMethod gMethods[] = {
    /* name, signature, funcPtr */
    { "isLoggable",      "(Ljava/lang/String;I)Z", (void*) android_util_Log_isLoggable },
    { "println_native",  "(IILjava/lang/String;Ljava/lang/String;)I", (void*) android_util_Log_println_native },
};
int register_android_util_Log(JNIEnv* env)
{
    jclass clazz = env->FindClass("android/util/Log");

    if (clazz == NULL) {
        ALOGE("Can't find android/util/Log");
        return -1;
    }

    levels.verbose = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "VERBOSE", "I"));
    levels.debug = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "DEBUG", "I"));
    levels.info = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "INFO", "I"));
    levels.warn = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "WARN", "I"));
    levels.error = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ERROR", "I"));
    levels.assert = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ASSERT", "I"));

    return AndroidRuntime::registerNativeMethods(env, "android/util/Log", gMethods, NELEM(gMethods));
}

register_android_util_Log函数向java.util.Log类中注册了gMethods中的两个方法:isLoggable和println_native。

但是当我打开eclipse时,查看Log类中的源码并没有这两个类,我又用了jd-jui打开了Android SDK中4.4的jar包,发现了native方法isLoggable,但是依旧没有发现println_native方法,我猜测Android SDK中的类和方法毕竟是不全的


结语:还有很多地方没有分析到,比如dalvik虚拟机参数的分析、dvmStartup函数中大量初始化函数的功能等。

时间: 2024-10-13 00:56:35

【分析】dalvik虚拟机启动过程(三)的相关文章

【分析】dalvik虚拟机启动过程(二)

源码版本:Android-4.4.4_r2 提示:大部分分析直接注释在代码内. 接着上一篇[分析]dalvik虚拟机启动过程(一) JNI_CreateJavaVM函数调用dvmCreateJNIEnv创建JNIEnv后,接着又调用了dvmStartup函数初始化VM: /* * VM 初始化. * VM initialization. Pass in any options provided on the command line. * Do not pass in the class nam

【分析】dalvik虚拟机启动过程(一)

源码版本:Android-4.4.4_r2 提示:大部分分析直接注释在代码内. 主要函数的调用层次: |AndroidRuntime::start |AndroidRuntime::startVm |JNI_CreateJavaVM |dvmCreateJNIEnv |dvmStartup |dvmThreadStartup |pthread_key_create |dvmAllocBitVector |allocThread |prepareThread |assignThreadId |dv

Android 源码分析-Dalvik 虚拟机创建过程

更多完整项目下载.未完待续.源码.图文知识后续上传github.可以点击关于我?联系我获取 一. 介绍Dalvik 1.java的运行需要JVM,同样android中使用了java语言,也需要一个VM.针对手机处理器和内存等硬件资源不足而推出来的一款VM,为android运行提供环境,叫DVM. 2.Dalvik虚拟机允许多个instance的存在.实际上android中的每一个app都是运行在自己VM实例之中(沙盒).每一个VM实例在linux中又是一个单独的进程,所以可以认为是同一个概念.运

openstack学习笔记一 虚拟机启动过程代码跟踪

本文主要通过对虚拟机创建过程的代码跟踪.观察虚拟机启动任务状态的变化,来透彻理解openstack各组件之间的作用过程. 当从horizon界面发送一个创建虚拟机请求,horizon api 将会依据前端给定的数据信息.调用novaclient 生成一个创建虚拟机的http post 请求来创建vm服务. >/usr/lib/python2.6/site-packages/horizon/api/nova.py(334)server_create() > /usr/lib/python2.6/

一步一步分析新建App启动过程

IOS温故而知新(一)  一步一步分析新建App启动过程 笔者接触IOS大概半年的时间,可以说能够开发App,但是又有很多不足的地方,因此打算写一些技术文章,能够达到温故而知新的效果,难免会有错误或者遗漏,也希望各位看官不吝指教.另外宣传一下刚建立的群“IOS菜鸟到高手之路”,312747764,欢迎希望交流分享的人加入. 1.IOS系统的简单说明IOS与Mac OS X以及安卓一样都属于类UINX系统,然而熟悉类UNIX系统的人可能会失望的是,个人开发的App会进入类似chroot的状态,被操

Android 源码分析(十) Dalvik 虚拟机创建过程

一. 介绍Dalvik 1.java的运行需要JVM(后面有大量篇幅介绍),同样android中使用了java语言,也需要一个VM.针对手机处理器和内存等硬件资源不足而推出来的一款VM,为android运行提供环境,叫DVM. 2.Dalvik虚拟机允许多个instance的存在.实际上android中的每一个app都是运行在自己VM实例之中(沙盒).每一个VM实例在linux中又是一个单独的进程,所以可以认为是同一个概念.运行在自己的DVM进程之中,不同的app不会相互干扰,且不会因为一个DV

linux内核学习之三 跟踪分析内核的启动过程

一   前期准备工作       1 搭建环境 1.1下载内核源代码并编译内核 创建目录,并进入该目录: 下载源码: 解压缩,并进入该目录:xz -d linux-3.18.6.tar.xz tar -xvf linux-3.18.6 cd  linux-3.18.6 选定x86架构的相关文件编译: 编译: 1.2 制作根文件系统 在工作目录下新建一个文件夹: mkdir rootfs 下载老师提供的资料:git clone https://github.com/mengning/menu.gi

wxWidgets源码分析(1) - App启动过程

目录 APP启动过程 wxApp入口定义 wxApp实例化准备 wxApp的实例化 wxApp运行 总结 APP启动过程 本文主要介绍wxWidgets应用程序的启动过程,从app.cpp入手. wxApp入口定义 wxApp通过IMPLEMENT_APP宏注册App类,这个宏同时定义了入口,实现在wx/app.h文件中. // wx/app.h 文件中定义 #define IMPLEMENT_APP(app) wxIMPLEMENT_APP(app); // 可以忽略 wxIMPLEMENT_

Netty源码分析之客户端启动过程

一.先来看一下客户端示例代码. 1 public class NettyClientTest { 2 public void connect(int port, String host) throws Exception { 3 EventLoopGroup group = new NioEventLoopGroup();//与服务端不同,客户端只需要一个IO线程组 4 5 try { 6 Bootstrap b = new Bootstrap(); 7 b.group(group) 8 .op