阅读JVM代码的方法之一就是写一个JNI程序,然后单步跟踪代码。
一、编译出jvm.dll的debug版本。
在我的机器上我用了这个编译命令:build debug compiler1 D:\temp\hotspot C:\Java\jdk1.7.0
在我的机器上我用了这个编译命令:build debug compiler1 D:\temp\hotspot C:\Java\jdk1.7.0
编译的详细方法,可以参考 这里。
二、假设jre安装在:C:\Java\jre1.7.0,那么在C:\Java\jre1.7.0\bin下新建一个目录,目录名称自己定,
例如我就给它叫做:MyJVM。把debug版的jvm.dll复制到:C:\Java\jre1.7.0\bin\MyJVM
例如我就给它叫做:MyJVM。把debug版的jvm.dll复制到:C:\Java\jre1.7.0\bin\MyJVM
这一步是因为在默认情况下,jvm.dll和JRE其他的dll、jar需要这样一个目录层次关系。
这也是正式发布的JRE的jvm.dll位于\bin\client下的原因。
这也是正式发布的JRE的jvm.dll位于\bin\client下的原因。
三、在VS中写一个JNI的应用程序,让exe的输出目录为:C:\Java\jre1.7.0\bin\MyJVM
经过这三步后,编译通过,就可以调试jvm.dll了
下面的代码是一个JNI应用程序的例子,先加载JVM,然后就释放JVM。
#include "stdafx.h"
#include
#include
#include
#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='X86' publicKeyToken='1fc8b3b9a1e18e3b' language='*'\"")
int _tmain(int argc, _TCHAR* argv[])
{
int res;
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
vm_args.version=JNI_VERSION_1_2;
options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.class.path=.";
options[2].optionString = "-verbose:jni";
{
int res;
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
vm_args.version=JNI_VERSION_1_2;
options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.class.path=.";
options[2].optionString = "-verbose:jni";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 3;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (res < 0)
{
fprintf(stderr, "Can't create Java VM\n");
vm_args.nOptions = 3;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (res < 0)
{
fprintf(stderr, "Can't create Java VM\n");
return 1;
}
}
jvm->DestroyJavaVM();
fprintf(stdout, "Java VM destory.\n");
return 0;
}
fprintf(stdout, "Java VM destory.\n");
return 0;
}
其中代码:
#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='X86' publicKeyToken='1fc8b3b9a1e18e3b' language='*'\"")
在VS2005中需要,如果没有上面这行代码,运行会提示:没有找到 MSVCR80.dll
这行代码在VS2003中不需要。
#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='X86' publicKeyToken='1fc8b3b9a1e18e3b' language='*'\"")
在VS2005中需要,如果没有上面这行代码,运行会提示:没有找到 MSVCR80.dll
这行代码在VS2003中不需要。