java.c阅读
java.c是编译java或者其他的命令,如javac,javap等的程序,其基本的处理是:根据命令行参数,加载适合的Java虚拟机,并调用该虚拟机的方法,执行制定的类。由于java.c只是JVM的一个启动包装,因此,其代码比较简单。
1、java.c包含了与平台无关的代码,而java_md.c则包含与平台相关的代码,在不同的平台上,对JVM安装的目录、虚拟机的文件结构均略有不同,这些代码就包存在java_md.c中。
在 函数LoadJavaVM中,首先要查找到JVM所在的位置,该虚拟机的名称在Linux上为libjvm.so,在Windows下为 libjvm.dll,在Linux上,使用dlopen装入该动态连接库,然后使用dlsym定为两个函数:JNI_CreateJavaVM, JNI_GetDefaultJavaVMInitArgs,然后调用JNI_CreateJavaVM就可以创建JVM了。
jint JNI_CreateJavaVM(JavaVM **pvm, JNIEnv **env, void *args)
其中JavaVM用于返回创建的JavaVM(在jni.h中定义,包含了几个JavaVM的输出方法),env用于返回JNIEnv结构,该结构包含了众多的jni方法,在后续的处理过程中,可以在C中直接调用jni方法。
在JVM 初始化完成后,通过env->FindClass方法,将要运行的类装入进来。使用env- >GetStaticMethodID方法获得main方法的句柄,然后通过env-& gt;CallStaticVoidMethod来执行main方法。
因此,要进一步的对JVM进行分析,首先要:
- 了解 JNI_CreateJavaVM是如何初始化JVM的
- JNI方法FindClass将负责装载一个类,其中涉及了类的装载的过程。
- JNI方法CallStaticVoidMethod方法,该方法涉及到Java代码的执行。
0 Comments:
张贴评论
<< Home