移植jamvm虚拟机到arm板
soft environment:
OS:ubuntu11.10
compiler:arm-linux-gcc-4.3.2
transpantation target:
arm-linux-gcc:arm-linux-gcc-4.3.2
java virtual machine:jamvm-1.4.3
classpath:classpath-0.92
一.安装arm-linux-gcc
使用
二.编译classpath-0.92
1.下载
http://savannah.gnu.org/projects/classpath
ftp://ftp.gnu.org/pub/gnu/classpath/
http://www.gnu.ort/software/classpath/
网址中有很多版本的classpath,只要classpath-0.92这个版本的
2.解压
tar -zxvf classpath-0.92 -C ./
解压到当前目录下,获得classpath-0.92文件夹
3.进入classpath-0.92文件夹(整个操作最好都在家目录下运行,不要使用sudo,生成的makefile,也需要sudo,在能够有权限执行)
./configure CC=arm-linux-gcc AR=arm-linux-ar LD=arm-linux-ld RANLIB=arm-linux-ranlib STRIP=arm-linux-strip --host=arm-linux --disable-gtk-peer --disable-gconf-peer --disable-plugin --with-jikes --with-jni --prefix=/home/cp/classpath
CC详解:
CC 是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件的功能编译时,它首先调用预处理程序(cpp)对输入的源程序进行处理,然后调用 cc1 将预处理后的程序编译成汇编代码,最后由arm-elf-as将汇编代码编译成目标代码。
CC具有丰富的命令选项,可以控制编译的各个阶段,满足用户的各种编译需求。
AS详解:
AS将汇编语言程序转换为ELF (Executable and Linking Format,执行时链接文件格式)格式的可重定位目标代码,这些目标代码同其它目标模块或函数库易于定位和链接。
AS产生一个交叉参考表和一个标准的符号表,产生的代码和数据能够放在多个区 (Section)中。
AR详解:
AR 将多个可重定位的目标模块归档为一个函数库文件。采用函数库文件,应用程序能够从该文件中自动装载要参考的函数模块,同时将应用程序中频繁调用的函数放入函数库文件中,易于应用程序的开发管理。arm-elf-ar支持ELF格式的函数库文件.
用来管理和维护静态库,但是不更新库的符号索引表,更新库的符号索引表的工作由ranlib或者ar -s来实现
RANLIB详解
RANLIB 是用来更新库的符号索引表,向某一个库文件增加了一个.o文件之后,必须是用ranlib来更新符号索引表,才能访问刚刚增加的.o的中全局变量和函数。
LD详解:
LD根据链接定位文件Linkcmds中的代码区、数据区、BSS区和栈区等定位信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序。该目标程序是ELF格式,并且可以包含调试信息。
LD会产生一个内存映象文件Map.txt,该文件显示所有目标模块、区和符号的绝对定位地址。它也产生交叉参考列表,显示参考每个全局符号的目标模块。
LD支持将多个目标模块链接成一个单一的、绝对定位的目标程序,也能够依此对目标模块进行链接,这个特性称为增量链接(Incremental Linking)。
假如输入文件是一个函数库,arm-elf-ld会自动从函数库装载被其它目标模块参考的函数模块。LD与其它链接程序相比,能提供更有帮助的诊断信息。许多链接器遇到第一个错误即放弃链接,而arm-elf-ld只要有可能都继续执行,帮助用户识别其它错误,有时甚至能获得输出代码。
STRIP详解
主要用来去除执行文件或者库文件的调试信息。
--disable-gtk-peer
--disable-gconf-peer 这个表示编译的类库不支持窗口调用
--disable-plugin 还不知道
--with-jikes
--with-jni
这两个还不知到
--prefix 指定make install 的时候 将classpath库文件安装的位置
4.make;make install
注意 以上动作都最好在自己家目录进行操作,并且不要用sudo
三.编译jamvm-1.4.3
1.下载,
比较好的网站是在sourceforge.net这个网站搜索jamvm
找到jamvm-1.4.3.tar.gz
2.解压
tar -zxvf jamvm-1.4.3.tar.gz -C ./
获得jamvm-1.4.3文件夹
3.进入jamvm-1.4.3文件夹
./configure CC=arm-linux-gcc AR=arm-linux-ar LD=arm-linux-ld CPP=arm-linux-cpp RANLIB=arm-linux-ranlib STRIP=arm-linux-strip --host=arm-linux --prefix=/home/cp/jamvm --with-class-path-install-dir=/home/cp/classpath
--with-class-path-install-dir 表示classpath安装的目录
--frefix 表示自己安装的目录
四.移植classpath和jamvm
通过以上步骤之后会获取到classpath和jamvm两个文件
将这两个文件复制到开发板上
要注意的是,classpath/lib/classpath 这个文件夹下是库文件,有很多的.a或者.la等静态库文件,也有.so*动态库文件,还有链接到动态库文件的软链接文件(他们必须依赖他们所链接动态库文件),一定要将这三个类型的文件复制过去,链接文件作为动态库文件的别名,让动态库文件具有更好的通用性。所以软件接文件一定要有
如果是在相同的文件系统下进行复制的话,cp命令满足以下规则
不带参数的cp对链接文件进行复制的时候,会直接复制动态库文件的副本,这样做其实也可以,但是这样就会增加整个库文件的大小,所以要保证复制的是软连接文件,那么一定要加上-l 参数
如果在不同的文件系统下进行复制的话,
1.这样就必须是用不带参数的cp,保证复制了具有软链接名的动态库文件副本
2.先不复制软件文件,在移植的系统上进行 “ln -s 动态链接库 软连接库名 ” 这个名进行一个个的创建
如果在相同的文件系统下进行移动的话
不带参数的mv,直接就具有保存软链接文件 的连接属性的功能,所以在相同文件系统下进行移动软链接的话,使用不带参数的mv是一个比较好的选择
但是在不同的文件系统下进行移动的话,mv就无能为力了,
经过上面的步骤之后,基本上已经一直完成,还有一个步骤就是在arm板上配置环境变量BOOTCLASSPATH,PATH,LD_PIBRARY_PATH的位置
我将classpath和jamvm移植到了/opt下
下面是我配置的路径
export BOOTCLASSPATH=/opt/jamvm/share/jamvm/classes.zip:/opt/jamvm/lib/classpath/share/classpath/glibj.zip
export LD_LIBRARY_PATH=/opt/jamvm/lib/classpath/lib/classpath/
export PATH=$PATH:/opt/jamvm/bin/
还有一种写法
BOOTCLASSPATH=/opt/jamvm/share/jamvm/classes.zip:/opt/jamvm/lib/classpath/share/classpath/glibj.zip
LD_LIBRARY_PATH=/opt/jamvm/lib/classpath/lib/classpath/
PATH=$PATH:/opt/jamvm/bin/
export BOOTCLASSPATH LD_LIBRARY_PATH PATH
将以上命令写入/etc/profile下面(我在我的arm板上试过写在/etc/init.d/rcS下面,重启之后不行,但是写在profile下就可以),重新启动一下,就行了
还有一些环境变量CLASSPATH,实际上,我们是不需要配置的,如果配置了的话,那么我们的.jar文件只能在CLASSPATH这个环境变量下指定的目录下进行工作
五.在arm上运行程序
遇到了如下的问题
1:
使用 jamvm -jar a.jar (要注意的是,在linux(arm板上或者是ubuntu上)的命令行下,一定不要只运行.class文件,而是要运行.jar文件,对于单个文件的工程生成j.ar好说,但是对于多个文件或者说是多个工程生成.jar文件包,则在eclipse下是可以使用某一个插件的,至于是哪一个插件,暂时忘记了名字)
cannot create system class loader
Exception ocuured whiel printing exception(java/lang/NoClassDefFoundError)...
Original exception was java/lang/UnsatisfiedLinkError
这个错误实际上是,刚刚复制的过程中classpath/lib/classpath这个文件夹下的软链接文件没有复制过来,我是使用sd卡拷贝的,所以遇到了这个情况,所以
解决方法:1.按原来的classpath/lib/classpath路径下,在这个文件夹下增加这些软链接文件,或者直接使用不带参数的cp,这样,库文件就会变得比较大一点
如果是同一个文件系统下的复制的话,就不会出现上述的问题了
2.使用jamvm -verbose:class -jar a.jar 就会看到一些调试信息,让我可以定位到时哪一个地方出现了问题
3.千万不要直接运行.class 文件,会出现问题的,要打成.jar包