欢迎来到天天文库
浏览记录
ID:61512997
大小:97.10 KB
页数:19页
时间:2021-02-09
《Dalvik虚拟机的运行过程分析.docx》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、从前面Dalvik虚拟机的启动过程分析一文可以知道,Dalvik虚拟机在Zygote进程中启动完成之后,就会获得一个JavaVM实例和一个JNIEnv实例。其中,获得的JavaVM实例就是用来描述Zygote进程的Dalvik虚拟机实例,而获得的JNIEnv实例描述的是Zygote进程的主线程的JNI环境。紧接着,Zygote进程就会通过前面获得的JNIEnv实例的成员函数CallStaticVoidMethod来调用com.android.internal.os.ZygoteInit类的静态成员函数main。这就相当于是将com.android.interna
2、l.os.ZygoteInit类的静态成员函数main作为Java代码的入口点。 接下来,我们就从JNIEnv类的成员函数CallStaticVoidMethod开始,分析Dalvik虚拟机的运行过程,如图1所示:图1Dalvik虚拟机的运行过程 这个过程可以分为9个步骤,接下来我们就详细分析每一个步骤。 Step1. JNIEnv.CallStaticVoidMethod[cpp] viewplaincopy1.struct _JNIEnv; 2....... 3.typedef _JNIEnv JNIEnv; 4....... 5.
3、 6.struct _JNIEnv { 7. /* do not rename this; it does not seem to be entirely opaque */ 8. const struct JNINativeInterface* functions; 9. ...... 10. 11. void CallStaticVoidMethod(jclass clazz, jmethodID methodID, ...) 12. { 13. va_list args; 14.
4、va_start(args, methodID); 15. functions->CallStaticVoidMethodV(this, clazz, methodID, args); 16. va_end(args); 17. } 18. 19. ...... 20.}; 这个函数定义在文件dalvik/libnativehelper/include/nativehelper/jni.h中。 JNIEnv实际上是一个结构,它有一个成员变量functions,指向的是一个回调函数表。这个回调函
5、数表使用一个JNINativeInterface对象来描述。JNIEnv结构体的成员函数CallStaticVoidMethod的实现很简单,它只是调用该回调函数表中的CallStaticVoidMethodV函数来执行参数clazz和methodID所描述的Java代码。 Step2. JNINativeInterface.CallStaticVoidMethodV[cpp] viewplaincopy1.struct JNINativeInterface { 2. ...... 3. 1. void (*CallStat
6、icVoidMethodV)(JNIEnv*, jclass, jmethodID, va_list); 2. 3. ...... 4.}; 这个函数定义在文件dalvik/libnativehelper/include/nativehelper/jni.h中。 JNINativeInterface是一个结构体,它的成员变量CallStaticVoidMethodV是一个函数指针。 从前面Dalvik虚拟机的启动过程分析一文可以知道,Dalvik虚拟机在内部为Zygote进程的主线程所创建的Java环境是用一个JNIEnvEx
7、t结构体来描述的,并且这个JNIEnvExt结构体会被强制转换成一个JNIEnv结构体返回给Zygote进程。 JNIEnvExt结构体定义在文件dalvik/vm/JniInternal.h中,如下所示:[cpp] viewplaincopy1.typedef struct JNIEnvExt { 2. const struct JNINativeInterface* funcTable; /* must be first */ 3. 4. ...... 5.} JNIEnvExt; 从这里就可以看出,虽然结构体J
8、NIEnvExt和JNI
此文档下载收益归作者所有