因爲是客戶的要求,需要移植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