移植java虚拟机到EM2440开发板

本文档记录了将Java虚拟机移植到EM2440开发板的过程,包括解压源码、修改makefile、设置环境变量、解决编译错误、添加特定定义以及测试运行HelloWorld程序和进行全面测试。在移植过程中,遇到的非法指令问题通过重新安装交叉编译器得以解决。

因为是客户的要求,需要移植Java虚拟机到EM2440开发板,已经验证成功,为此记录下来。

1、解压

# unzip phoneme_advanced-mr2-dev-src-b97-20_nov_2008.zip


文件phoneme_advanced-mr2-dev-src-b97-20_nov_2008.zip下载地址:

http://download.java.net/mobileembedded/phoneme/advanced/phoneme_advanced-mr2-dev-src-b97-20_nov_2008.zip


2、修改makefile

 #cd phoneme_advanced_mr2/cdc/build/linux-arm-generic
 #gedit GNUmakefile

 

修改CVM_TARGET_TOOLS_PREFIX=/usr/local/arm/4.3.2/bin/arm-linux-为自己的交叉编译器的地址。

修改 USE_AAPCS ?= false 为 true。

 

3、输出PATH

#gedit /etc/profile

在profile末尾添加:export PATH=/usr/local/arm/4.3.2/bin/:$PATH为自己的交叉编译器的地址。

4、 编译

#make  (可能会报错)
5、如果有出错提示可能是JDK、bison、flex没有安装

Java 的安装配置参考http://www.oracle.com/index.html,

或者在Ubuntu的新立德软件包中搜索Open Jdk。

另外的一两个工具可以通过在终端中通过一下命令安装:

  #apt-get installbison
  #apt-get install flex

 

6、可能出错

 ../../src/linux-arm/javavm/runtime/segvhandler_arch.c:45:26:error: asm/ucontext.h: No such file or directory
    ../../src/linux-arm/javavm/runtime/segvhandler_arch.c:In function 'handleSegv':
    ../../src/linux-arm/javavm/runtime/segvhandler_arch.c:224:error: dereferencing pointer to incomplete type
    ../../src/linux-arm/javavm/runtime/segvhandler_arch.c:285:error: dereferencing pointer to incomplete type
    ../../src/linux-arm/javavm/runtime/segvhandler_arch.c:285:error: dereferencing pointer to incomplete type
    ../../src/linux-arm/javavm/runtime/segvhandler_arch.c:286:error: dereferencing pointer to incomplete type
    ../../src/linux-arm/javavm/runtime/segvhandler_arch.c:294:error: dereferencing pointer to incomplete type
修改segvhandler_arch.c 文件
 
   #gedit../../src/linux-arm/javavm/runtime/segvhandler_arch.c

修改

#define ucontext asm_ucontext
    #include <asm/ucontext.h>

    

    //#defineucontext asm_ucontext     //注释掉这句
    #include<ucontext.h>            //去掉arm/

7、再编译

 #make

 编译成功!

 

ls可以看到当前的目录下有这三个文件和文件夹:

   lib   bin   testclasses.zip

附注:
运行时如有报错:
Java VM panic: AAPCS calling convention used; compilation must use –DAAPCS

然后,如果不在GNUmakefile之中添加 “CVM_DEFINES += -DAAPCS”这一行,就会 EM2440的linux 中执行

./cvm -cp ../testclasses.zip HelloWorld 语句时,出现以下错误:

Java VM panic: AAPCS calling convention used; compilation must use -DAAPCS.


所以,除了要在GNUmakefile之中,修改USE_AAPCS ?= false为true,还要在CVM_DEFINES += 这一句后面添加上 -DAAPCS。

修改完上面的内容以后,要先执行makeclean&&make distclean,最后再执行make

8、测试

1)复制上面的三个文件和文件夹到/home/sky/目录。

2)、在开发板/etc/init.d/rcS文件里加入如下:
        JAVA_HOME=/home/sky
        exportPATH=$JAVA_HOME/bin:$PATH
        export CLASSPATH=.:$JAVA_HOME/lib

3)、经典的HelloWorld。

#cd /home/sky/bin/

#./cvm -cp ../testclasses.zip HelloWorld

可以看到输出了 HelloWorld.

4)、全面测试。
 # ./cvm-cp ../testclasses.zip Test


        *Number of command line arguments: 0
        Starting test1
        ...recurse
        ...recurse
        ...recurse
        ...link
        ...link
        ...link
        Starting test1 again
        ...recurse
        ...recurse
        ...recurse
        ...link
        ...link
        ...link
        test6: Caught inner java.lang.NullPointerException
        test6: Caught outerjava.lang.NullPointerException
        Testing Array Copy
        *TestE exception thrown because"I'm feeling Testy"
        *<clinit> threwjava.lang.ExceptionInInitializerError
        *<clinit> threwjava.lang.NoClassDefFoundError: StaticE
        c1 = class [LTest;
        c2 = class [[LTest;
        c3 = class [LC;
        c4 = class [[LC;
        c1.modifiers = 1041
        c2.modifiers = 1041
        c3.modifiers = 1040
        c4.modifiers = 1040
        *FloatMIN =1.4E-45
        *FloatMAX =3.4028235E38
        FloatMIN (the int bits) =1
        FloatMAX (the int bits)=2139095039
        java.lang.IllegalArgumentException:too many dimensions
            atjava.lang.reflect.Array.multiNewArray(Native Method)
            atjava.lang.reflect.Array.newInstance(Unknown Source)
            atTest.testDeepArrayConstruction(Unknown Source)
            atTest.main(Unknown Source)
            atsun.misc.CVM.runMain(Unknown Source)
        Constructed an object of type
        [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[LTest;
        finally!
        Requesting GC with a latencyrequest of 2 seconds
        (Turning GC tracing on)
        Sleeping 5 seconds, and waitingfor GC's
        Woke up! Cancelling latencyrequest
        .............
        *CONGRATULATIONS: test Testcompleted with 411 tests passed and 0 failures
        *Output lines starting with a *should be checked for correctness
        *They can be compared tosrc/share/javavm/test/TestExpectedResult
        *CONGRATULATIONS: test Testcompleted with 411 tests passed and 0 failures
       

到这里就说明移植成功了。

附注

出现问题:

把三个文件放到开发板运行时出现 illegal instruction。
解决:
重新安装交叉编译器arm-linux-gcc-4.3.2。


参考:http://wenku.baidu.com/link?url=ls84-soKRfZwp0CtlTkv0MDb7-Zgq_gvQd3rd8Gl1V-5jOwicLQBWq53HHmJgNDGm4mcHwX9sdkMMA2q-bYM76Z1PTmV5K7on7txi_paesi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值