交叉编译环境:arm-none-linux-gnueabi-
运行java的虚拟机是jamvm 它需要配合classpath共同使用。
GNU Classpath
下载
http://www.gnu.org/software/classpath/downloads/downloads.html
在/usr
文件夹下面新建文件夹classpath和jamvm(为了方面移植)
配置:
./configure --prefix=/usr/classpath --disable-gtk-peer --disable-gconf-peer --disable-plugin --with-ecj --host=arm-none-linux-gnueabi –disable-tools
执行:make
出现错误:cpnet.c:583: error: dereferencing type-punned pointer will break strict-aliasing rules
查找百度,给的解释是这样的:
he error you are seeing is a warning. By default GNU Classpath is configured to treat warnings as errors. To turn this off, add
--disable-Werror
重新配置:./configure --prefix=/usr/classpath --host=arm-none-linux-gnueabi --disable-examples --without-x --disable-qt-peer --disable-gtk-peer --disable-gconf-peer --disable-plugin --disable-alsa --disable-dssi --disable-Werror --disable-tools
执行make
执行make install
JVM
下载https://sourceforge.net/projects/jamvm/files/jamvm/
配置:
./configure --prefix=/usr/jamvm --with-classpath-install-dir=/usr/classpath --host=arm-none-linux-gnueabi
出现错误:zlib is missing
我移植blueZ
的时候安装过zlib,安装在我的/usr/blueZ文件夹下面
重新配置:./configure --prefix=/usr/jamvm --with-classpath-install-dir=/usr/classpath --host=arm-none-linux-gnueabi CFLAGS=-I/usr/blueZ/include LDFLAGS=-L/usr/blueZ/lib
执行make
执行make install
开发板上电,因为classpath
和jamvm都是装在/usr/classpath和/usr/jamvm文件夹下面。所以需要将classpath和jamvm两个文件夹复制到开发板的
/usr目录下面
配置环境变量:
第一种方法:
vi /etc/profile
在最后一行加入export PATH=$PATH:/usr/jamvm/bin
保存退出
然后执行source /etc/profile
可以通过echo $PATH
来查看结果如下:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/topeet/bin::/usr/jamvm/bin
运行jamvm HelloWorld
出现错误Segmentation fault
我以为是我的环境变量没设置
export LD_LIBRARY_PATH=/usr/classpath/lib/classpath:$LD_LIBRARY_PATH
export BOOTCLASSPATH=/usr/jamvm/share/jamvm/classes.zip:/usr/local/classpath/share/classpath/glibj.zip
设置了之后还是同样的错误。
查找百度,在配置中加入—enable-ffi
./configure --prefix=/usr/jamvm --with-classpath-install-dir=/usr/classpath
--enable-ffi --host=arm-none-linux-gnueabi CFLAGS=-I/usr/blueZ/include LDFLAGS=-L/usr/blueZ/lib
出现错误missing ffi.h
解决办法;
需要安装libffi ,这个我之前做blueZ移植的时候安装过,我当时的安装文件夹是/usr/blueZ.。所以ffi.h文件是在/usr/blueZ/lib/libffi-3.0.13/include/
将里面的ffi.h ffitarget.h
复制到/usr/blueZ/include中。
重新配置编译
然后执行make
执行make install
将jamvm
重新复制到开发板的/usr文件夹下然后运行jamvm
出现错误提示:jamvm: error while loading shared libraries: libffi.so.6: cannot open shared object file: No such file or directory
缺少libffi.so.6
这个文件在/usr/blueZ/lib(我的libffi是安装在/usr/blueZ中的)文件夹下面。我直接将libffi.so、libffi.so.6、libffi.so.6.0.1
全部都移植到了开发板的/lib
目录下。
再次运行jamvm
成功。
拷贝到开发板/usr
文件夹下面,运行jamvm HelloWorld还是出现Segmentation fault
崩溃了。。。。
继续百度,看到一条在jamvm configure
时加上 --disable-int-inlining
尝试配置:
./configure --prefix=/usr/jamvm --with-classpath-install-dir=/usr/classpath --enable-ffi
--disable-int-inlining --host=arm-none-linux-gnueabi CFLAGS=-I/usr/blueZ/include LDFLAGS=-L/usr/blueZ/lib
然后make
然后
make install。将jamvm文件夹复制到开发板/usr文件夹下面。运行
jamvm HelloWorld
成功
我试了一下Hellloworld
程序在win7下和ubuntu下通过javac编译都可以在开发板上运行,但是win7下编译的却不能在ubuntu上运行,因为本人不是做java开发的,没有花大量时间去深究。
后来尝试用相同的方法编译安装jamvm2.0 成功了
但是在编译classpath0.99时
配置./configure --prefix=/usr/classpath --host=arm-none-linux-gnueabi --disable-examples --without-x --disable-qt-peer --disable-gtk-peer --disable-gconf-peer --disable-plugin --disable-alsa --disable-dssi --disable-Werror --disable-tools
在0.98
的时候配置是没有问题的,但是0.99的时候出现问题
conditional "GCJ_JAVAC" was never defined.
根据百度的结果,解决方式是假设GCJ
没有定义,但是它也没有用到过,则就把那个if判断给屏蔽了如图所示,用#屏蔽了
但是在make中出现错误不知道怎么解决。
另外jamvm的库也可以用openjdk,也就是说用jamvm来替换openjdk的虚拟机