码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-03-29 00:37:25      阅读:209      评论:0      收藏:0      [点我收藏+]

标签: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函数中大量初始化函数的功能等。



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

标签:dalvik虚拟机

原文地址:http://blog.csdn.net/zylc369/article/details/44712285

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!