主题 : 移植java虚拟机到FriendlyArm Mini2440 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 55184
精华: 1
发帖: 76
金钱: 430 两
威望: 86 点
贡献值: 1 点
综合积分: 172 分
注册时间: 2011-09-13
最后登录: 2015-10-01
楼主  发表于: 2011-10-23 11:29

 移植java虚拟机到FriendlyArm Mini2440

管理提醒: 本帖被 xoom 执行加亮操作(2011-10-23)
一、选用sun的phoneme
    https://phoneme.dev.java.net/

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

三、解压
    unzip phoneme_advanced-mr2-dev-src-b97-20_nov_2008.zip

四、修改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

五、输出PATH
    export PATH=/usr/local/arm/4.3.2/bin/:$PATH                     为自己的交叉编译器的地址

六、编译
    make  (可能会报错)

七、如果有出错提示可能是JDK、bison、flex没有安装

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

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

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

        apt-get install bison

        apt-get install flex

八、还是出错
    ../../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>
    为
    //#define ucontext asm_ucontext     //注释掉这句
    #include <ucontext.h>            //去掉arm/

九、再编译
    make

    编译成功!

    ls 可以看到在当前目录有
    bin   lib   testclasses.zip

附注:运行时如有报错:

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

然后,如果不在GNUmakefile 之中添加 “ CVM_DEFINES += -DAAPCS ” 这一行,就会在mini2440的linux 中执行 ./cvm -cp ../testclasses HelloWorld 语句时,出现以下错误:

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


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

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

十、测试
    1)、拷贝上面三个文件与文件夹到开发板/home/j2me目录

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

    3)、经典的HelloWorld
        cd /home/j2me/bin
        ./cvm -cp ../testclasses 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 outer java.lang.NullPointerException
        Testing Array Copy
        *TestE exception thrown because "I'm feeling Testy"
        *<clinit> threw java.lang.ExceptionInInitializerError
        *<clinit> threw java.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
            at java.lang.reflect.Array.multiNewArray(Native Method)
            at java.lang.reflect.Array.newInstance(Unknown Source)
            at Test.testDeepArrayConstruction(Unknown Source)
            at Test.main(Unknown Source)
            at sun.misc.CVM.runMain(Unknown Source)
        Constructed an object of type
        [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[LTest;
        finally!
        Requesting GC with a latency request of 2 seconds
        (Turning GC tracing on)
        Sleeping 5 seconds, and waiting for GC's
        Woke up! Cancelling latency request
        .............
        *CONGRATULATIONS: test Test completed with 411 tests passed and 0 failures
        *Output lines starting with a * should be checked for correctness
        *They can be compared to src/share/javavm/test/TestExpectedResult

        *CONGRATULATIONS: test Test completed with 411 tests passed and 0 failures
        这句话意味着什么,我就不说了~~ 恭喜你!
级别: 新手上路
UID: 32897
精华: 0
发帖: 31
金钱: 155 两
威望: 31 点
贡献值: 0 点
综合积分: 62 分
注册时间: 2010-11-23
最后登录: 2013-02-28
1楼  发表于: 2012-08-12 13:05