openJdk 项目导入Visual Studio

来源:互联网 发布:电脑屏幕监控软件教师 编辑:程序博客网 时间:2024/05/21 22:55
转载:http://linmingren.me/blog/2012/01/%E7%BB%99openjdk-jvm-%E6%9E%84%E5%BB%BAvc2010%E5%B7%A5%E7%A8%8B/



给OpenJDK JVM 构建VC2010工程

《深入理解Java虚拟机:JVM高级特性与最佳实践》里面介绍了如何在Windows上通过命令行构建整个OpenJDK (参见http://www.iteye.com/topic/1097344),包括了虚拟机部分以及类库部分。步骤很详细,不过看到一整页的命令行参数,让人很头晕。而且构建出来用处也不是很多,因为你也根本都没法调试,跟踪JVM的运行流程。最好的方法是能在VC IDE中构建JVM. 查了一下,发现有个Oracle的哥们已经写一篇博文:http://blogs.oracle.com/poonam/entry/how_to_create_vc_project。步骤比上面那个要简单很多。我自己的步骤如下:

1. 安装VC2010 express 以及Windows Platform SDK。

2. 安装cygwin,参考http://www.iteye.com/topic/1097344中安装cygwin的部分,记得装在c:/cygwin下,否则后面的步骤5需要修改。

3. 从http://download.java.net/openjdk/jdk7/下载OpenJDK 代码,并解压到本地目录。我下的openjdk 7的源码。

4.从开始菜单运行cmd.exe,先用set path=%path%;c:/cygwin/bin把cygwin的程序都加到path中,然后跳到{openjdk解压目录}\hotspot\make\windows,然后运行下vc2010的vsvars32.bat批处理文件: {VC 2010 安装目录}\Common7\Tools\\vsvars32.bat, 比如我的是 d:\Progra~1\Micros~1.0\Common7\Tools\\vsvars32.bat,这个文件会把vc的编译环境设置好,不然的话你后面会得到提示说cl.exe找不到之类的。(如果你想编译64位的jvm,那就需要用64位的编译器,这时不用运行vsvars32.bat,而是要运行”{vc安装目录}\VC\vcvarsall.bat” x86_amd64)

5. 在{openjdk解压目录}\hotspot\make\windows目录运行 create.bat JDK安装目录在运行前记得确认java_home的值不能有空格,如果是C:\Program Files\Java\jdk1.6.0_30的话,用set java_home=c:\Progra~1\Java\jdk1.6.0_30 改成不含空格的路径。

运行成功会在{openjdk解压目录}\hotspot\build\vs-i486下产生出一个jvm.vcxproj文件 (如果你前面用的是64位编译器,那么生成的文件在{openjdk解压目录}\hotspot\build\vs-amd64下),那就说明VC工程成功生成了!由于这不是一个vc 2010工程,所以你需要先启动VC 2010然后导入这个工程 (直接双击不会有效果)。、

6. 构建,按F7就行了,有个小问题,就是会提示一个psapi中的函数无法结果,这是因为没有把psapi.lib加到VC 的lib路径中,通过右键JVM工程,选择Property,然后在Linker->Input->Additional Dependencies里加入psapi.lib即可。最后的结果如下:

7. 调试,第六步的build成功后,就可以在hotspot\build\vs-amd64\compiler1\debug下面找到hotspot.exe和jvm.dll文件,其中hotspot.exe就相当于我们build出来的java.exe,它是在visual studio中通过调用hotspot\make\windows\makefiles\launcher.make生成的(你可以在jvm工程上右键,然后选择Build Events/Pre-Link Event/Command Line来一看究竟),而jvm.dll就是visual studio自己build出来(配置可以查看Linker/General/Output File),运行结果如下:

第一句话Using java runtime at *** 中的JDK目录是通过jdkpath.txt文件配置出来的,因为我们只build了JVM,没有build整个JDK,所以我们需要一个现成的JDK才能真正让我们的hotspot.exe去执行java程序。

下面让hotspot.exe执行一个jar文件,然后设置一个断点看看。先在visual studio的Debugging中设置要调试的程序是hotspot.exe,并指定jar文件,

接下来在jni.cpp中的JNI_CreateJavaVM函数里加一个断点,然后启动它就可以发现断点被触发了:


原创粉丝点击