关闭

移植kvm-cldc1.1到arm-linux上心得

3180人阅读 评论(2) 收藏 举报

到今天为止,移植KVM虚拟机的工作可以说是大概完成了,还有一点小的缺陷,但先把整个过程说一下吧。

所做的工作的目的是把以CLDC1.1为基础的KVM和移植到CPU是以ARM体系结构,以linux为嵌入式操作系统的开发板上。我们这里所说的linux并不是uClinux,而是一般的linux。下面说一下交差编译的环境:

  • CentOS
  • JDK1.4.2
  • CLDC1.1
  • GCC 3.4.6
  • Arm-linux-gcc 2.95.3交差编译工具(在电脑里的名字是cross -2.95.3.tar.bz2

 

建立交差编译环境

好!环境介绍完后,首先要介绍一下建立交差编译环境。其实这个我也没做过,把linux操作系统的镜像拿来后,环境就在了。但从别人的文章和linux上可以看出,环境搭配并不难。主要是把JDK下载下来,要下载那种支持UNIX的,以bin为后缀的文件,安装的过程就不说了。然后再把交差编译工具解压,先bunzip2 cross -2.95.3.tar.bz2,然后再tar xvf cross -2.95.3.tar。再把下载的KVM源文件j2me_cldc-1_1-fcs-src-winunix.zip解压到文件夹。

接下来是设置环境变量,首先先设置Arm-linux-gcc 2.95.3交差编译工具的路径,打开/etc/profile或是 ~/.bash_profile,在上面添加以下一句:

export PATH=/usr/local/arm/2.95.3/bin:$PATH

JAVA_HOME=/usr/local/JAVA/j2sdk1.4.2_11

PATH=$JAVA_HOME/bin:$PATH

CLASSPATH=$JAVA_HOME/lib:.

export JAVA_HOME PATH CLASSPATH

第一句是为了可以随时调用arm-linux-gcc命令;第二句是设置JAVA_HOME环境变量,主要还是为了方便写三、四句。第三句和第一句的作用一样,是为了可以随时调用到javajavac命令。第四句是为了方便引用JAVA类库。

在这里要注意的是,第三句“$JAVA_HOME/bin:$PATH”都是把原来的系统环境变量PATH加到“$JAVA_HOME/bin”的后面,形成一个新的环境变量,如:原来PATH的内容为“abcdefg”,用“PATH=$JAVA_HOME/bin:$PATH”之后,就变成了“$JAVA_HOME/binabcdefg”。在这里,千万不能写成“PATH=$PATH :$JAVA_HOME/bin”,也就是把“$PATH”放到前面,这样一来就变成“abcefg:$JAVA_HOME/bin”了。你可能奇怪会问,这有什么不行的呢?原因是这样的,CentOS自带了一个jre,版本是1.4.2,它是由gnu开发的一个Java运行环境,一般叫作gcj。它使用的类库为libgcj X-X-X。所以,它和我们平时用的sun开发的jre还不一样。这个gnu开发的jre的位置在 /usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/,在这个目录下有一个java文件,它用来执行.class文件。这个文件的一个软连接(就像windows的一个快捷方式),被放到 /etc/alternatives/ 下,这个软连接又被创建一个软连接放到 /usr/bin/ 下(真不知道为什么这么麻烦)。最后,/usr/bin/ 这个路径又被加到PATH环境变量中。所以,如果你如果用“PATH=$JAVA_HOME/bin:$PATH”方式把你新装的jvm的路径加到环境变量PATH中的话,“$JAVA_HOME/bin”就会被放到“/usr/bin/”的后面,如果你执行java命令的话,就会先从“/usr/bin/”中找到gnu开发的那个java命令,会造成错误。比如:当我要执行j2me_cldc/build/linux/Makefile文件后,每当走到编译jcc工具时总会遇到如下错误:

java -classpath classes JavaCodeCompact /
/
-arch KVM_Native -o nativeFunctionTableUnix.c classesUnix.zip
Exception in thread "main" java.lang.NoClassDefFoundError: while resolving class:

JavaCodeCompact

at java.lang.VMClassLoader...............................
at java.lang.Class..................................................

Caused by: java.lang.ClassNotFoundException: sun.misc.Compare not found in [file:classes/,

file:/usr/share/java/libgcj-3.4.6.jar, file:./, core:/]

at java.lang.Class..................................................
at java.lang.Class..................................................

make[2]: *** [nativeFunctionTableUnix.c] Error 1
make[2]: Leaving directory `/usr/local/JAVA/j2me_cldc/tols/jcc'
make[2]: *** [nativeFunctionTableUnix.c] Error 2
make[1]: Leaving directory `/usr/local/JAVA/j2me_cldc/tols/jcc'
make: *** [all] Error 1

 

错误提示我在解析JavaCodeCompact.class这个类时找不到sun.misc.Compare这个类。我上网上找了一下,sun.misc.Compare这个类包里的类主要是sun公司开发JVM时内部用的一个类包。这时我看到在找sun.misc.Compare这个类包时的路径是:file:classes/, file:/usr/share/java/libgcj-3.4.6.jar, file:./, core:/libgcj-3.4.6.jar就是gnu开发的jre运行时要找的类包。sun.misc.Compare是在sun开发的类包里面,它当然找不到了。所以出现上面的错误。

 

修改文件

这里,我们要修改的只有两处,那就是j2me_cldc/kvm/VmUnix/build/Makefile文件。因为我们的KVM是要运行在arm-linux(这里cpuarm体系结构,操作系统为linux的开发板简称为arm-linux)系统上。所以,KVM必须用arm-linux-gcc编译器编译。我们打开Makefile文件,把

ifeq ($(GCC), true)

   CC = gcc

   ………...

else

处的gcc改成arm-linux-gcc

ifeq ($(GCC), true)

   CC = arm-linux-gcc

   ………...

Else

 

第二处就是j2me_cldc/kvm/VmUnix/src/runtime_md.c文件,把这个文件中void InitializeFloatingPoint()函数中的两句注释掉,如:

#if defined(LINUX) && PROCESSOR_ARCHITECTURE_X86
/* Set the precision FPU to double precision */
// fpu_control_t cw = (_FPU_DEFAULT & ~_FPU_EXTENDED) | _FPU_DOUBLE;
// _FPU_SETCW(cw);
#endif

 

这样,就不会出现错误了,但也不支持浮点数了。这里我还不知道如何才能让它支持浮点数,并不出现错误。

最后,我们进入j2me_cldc/build/linux目录,执行make命令,这样,就会顺序完成。

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:476590次
    • 积分:6422
    • 等级:
    • 排名:第3750名
    • 原创:124篇
    • 转载:345篇
    • 译文:0篇
    • 评论:64条
    最新评论