编译
JAMVM 默认使用 GNUClasspath,但是这样的话仅支持 java1.5。
这里主要介绍 JAMVM 搭配 openjdk classpath 使用,可以支持到 openjdk9,这里采用 openjdk8:
源码下载
这里千万千万不要直接下载官网的源码,就是下面这个链接,因为 release 好久没更新,有些 fix 没进去。
https://sourceforge.net/projects/jamvm/files/
正确的下载姿势是到 Project 页面下载最新的 Snapshot,或者直接用 git clone:
https://sourceforge.net/p/jamvm/code/ci/master/tree/
然而这还不够,还是有些问题没修
新版 openjdk 在 60 以后在 jvm.c 里面加了几个函数,所以你会遇到以下错误:
libjava.so: symbol JVM_GetResourceLookupCacheURLs, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference
当然有人已经帮忙修复了,手动 merge 以下这个 commit:
https://github.com/xranby/jamvm/commit/25b39703b2c3468f666f6175ff94e46526d402a7
OK 下面正式开始编译
在此之前还是先安装 openjdk8 或者 oracle jdk8,并且配置环境变量,最好是 60 61 80 版本,其他版本我没试过。
sudo ./configure --with-java-runtime-library=openjdk8 CFLAGS=-g
sudo make install
sudo cp /usr/local/jamvm/lib/libjvm.so /usr/lib/jvm/jdk1.8.0_60/lib/amd64/server/
注意如果需要调试的话,要加上 CFLAGS=-g 禁止编译器优化。
简单来说就是用 jamvm 的 libjvm.so 替换 openjdk 的,openjdk 有一套通用的标准接口去调用 jvm 核心。
调试
gdb java -tui
(gdb) b xxx.c //打好断点
(gdb) run Test //run 你编译好的 class