交叉编译环境:arm-none-linux-gnueabi-

运行java的虚拟机是jamvm  它需要配合classpath共同使用。

GNU Classpath下载 http://www.gnu.org/software/classpath/downloads/downloads.html

/usr文件夹下面新建文件夹classpathjamvm(为了方面移植)

配置:

./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

 

开发板上电,因为classpathjamvm都是装在/usr/classpath/usr/jamvm文件夹下面。所以需要将classpathjamvm两个文件夹复制到开发板的 /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的虚拟机

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐