文档详情

(Dalvik虚拟机的运行过程分析.docx

发布:2017-01-19约1.79万字共19页下载文档
文本预览下载声明
?从前面Dalvik虚拟机的启动过程分析一文可以知道,Dalvik虚拟机在Zygote进程中启动完成之后,就会获得一个JavaVM实例和一个JNIEnv实例。其中,获得的JavaVM实例就是用来描述Zygote进程的Dalvik虚拟机实例,而获得的JNIEnv实例描述的是Zygote进程的主线程的JNI环境。紧接着,Zygote进程就会通过前面获得的JNIEnv实例的成员函数CallStaticVoidMethod来调用ernal.os.ZygoteInit类的静态成员函数main。这就相当于是将ernal.os.ZygoteInit类的静态成员函数main作为Java代码的入口点。 接下来,我们就从JNIEnv类的成员函数CallStaticVoidMethod开始,分析Dalvik虚拟机的运行过程,如图1所示:图1 Dalvik虚拟机的运行过程 这个过程可以分为9个步骤,接下来我们就详细分析每一个步骤。 Step 1.?JNIEnv.CallStaticVoidMethod[cpp]?view plaincopystruct?_JNIEnv;??......??typedef?_JNIEnv?JNIEnv;??......???struct?_JNIEnv?{???/*?do?not?rename?this;?it?does?not?seem?to?be?entirely?opaque?*/??const?struct?JNINativeInterface*?functions;???......????void?CallStaticVoidMethod(jclass?clazz,?jmethodID?methodID,?...)???{???va_list?args;???va_start(args,?methodID);???functions-CallStaticVoidMethodV(this,?clazz,?methodID,?args);???va_end(args);???}????......??};?? 这个函数定义在文件dalvik/libnativehelper/include/nativehelper/jni.h中。?JNIEnv实际上是一个结构,它有一个成员变量functions,指向的是一个回调函数表。这个回调函数表使用一个JNINativeInterface对象来描述。JNIEnv结构体的成员函数CallStaticVoidMethod的实现很简单,它只是调用该回调函数表中的CallStaticVoidMethodV函数来执行参数clazz和methodID所描述的Java代码。 Step 2.?JNINativeInterface.CallStaticVoidMethodV[cpp]?view plaincopystruct?JNINativeInterface?{???......????void?(*CallStaticVoidMethodV)(JNIEnv*,?jclass,?jmethodID,?va_list);????......??};???这个函数定义在文件dalvik/libnativehelper/include/nativehelper/jni.h中。 JNINativeInterface是一个结构体,它的成员变量CallStaticVoidMethodV是一个函数指针。 从前面Dalvik虚拟机的启动过程分析一文可以知道,Dalvik虚拟机在内部为Zygote进程的主线程所创建的Java环境是用一个JNIEnvExt结构体来描述的,并且这个JNIEnvExt结构体会被强制转换成一个JNIEnv结构体返回给Zygote进程。?JNIEnvExt结构体定义在文件dalvik/vm/JniInternal.h中,如下所示:[cpp]?view plaincopytypedef?struct?JNIEnvExt?{???const?struct?JNINativeInterface*?funcTable;/*?must?be?first?*/???......??}?JNIEnvExt;?? 从这里就可以看出,虽然结构体JNIEnvExt和JNIEnv之间没有继承关系,但是它们的第一个成员变量的类型是一致的,也就是它们都是指向一个类型为JNINativeInterface的回调函数表,因此,Dalvik虚拟机可以将一个JNIEnvExt结构体强制转换成一个JNIEnv结构体返回给Zygote进程,这时候我们通过JNIEnv结构体来访问其成员变量functions所描述的回调函数表时,实际访问到的是对应的JNIEnvExt结构体的成员变量funcTable所描述的回调函数表。
显示全部
相似文档