在嵌入式linux下搭建java运行环境

2019-07-12 14:49发布

交叉编译环境: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的虚拟机