参考:http://www.linuxidc.com/Linux/2011-08/41912.htm
http://witmax.cn/install-sun-java6-jdk.html
主机:ubuntu 12.04
交叉编译环境:gcc version 4.6.3
java虚拟机:下载sun的phoneme
开发板:s3c2440
一、解压
unzip phoneme_advanced-mr2-dev-src-b97-20_nov_2008.zip
二、配置java运行环境
由于本机使用的是ubuntu 12.04,安装java环境的时候需要如下配置
1、添加源
deb http://us.archive.ubuntu.com/ubuntu/ hardy multiverse
操作的方法是:sudo gedit /etc/apt/sources.list
在打开的文件的最后一行加上 deb http://us.archive.ubuntu.com/ubuntu/ hardy multiverse
最后保存退出
2、更新
sudo apt-get update
3、安装java
sudo apt-get install sun-java6-jdk
4、查看是否成功
java -version
三、配置文件
cd phoneme_advanced_mr2/cdc/build/linux-arm-generic
vim GUNmakefile
修改 USE_AAPCS ?= false 为 true
修改 CVM_TARGET_TOOLS_PREFIX=/work/tools/gcc-3.4.5-glibc-2.3.6/bin/arm-linux- (交叉编译环境的地址)
四、编译
make
假如提示arm-linux-gcc:command not found之类的信息,那就是交叉编译环境没有配置
可以用:echo $PATH查看
配置交叉编译环境的命令:export PATH=$PATH:/work/tools/gcc-3.4.5-glibc-2.3.6/bin
五、编译成功
产生新的文件,在其中找到 bin lib testclasses.zip三个文件,拷贝到arm下的文件系统
假设这个文件叫做/home/j2me/
六、在arm下的环境配置
1、在/etc/init.d/rcS下添加如下内容
JAVA_HOME=/home/j2me
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib
2、测试程序
"Hello world!"问题:./cvm -cp testclasses.zip HelloWorld
全面的测试:./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"
* threw java.lang.ExceptionInInitializerError
* 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
出现以上信息,则移植成功
3、测试一个自己的“ hello world! "程序
public class helloworld {
public static void main(String[] args) {
System.out.println(" hello world! ");
}
}
在主机ubuntu12.04上用javac helloworld.java编译程序
然后用java helloworld试运行,假如成功,将helloworld.class拷贝到arm板子的/home/j2me/bin/目录下
用./cvm helloworld试运行
假如出现下面这样的问题:
java.lang.UnsupportedClassVersionError: helloworld (Unsupported major.minor version 50.0)
at sun.misc.Launcher$AppClassLoader.findContainer(Native Method)
at sun.misc.Launcher$AppClassLoader.access$400(Unknown Source)
at sun.misc.Launcher$AppClassLoader$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Unknown Source)
at java.security.AccessController.doPrivileged(Unknown Source)
at sun.misc.Launcher$AppClassLoader.doClassFind(Unknown Source)
at sun.misc.Launcher$AppClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.CVM.runMain(Unknown Source)
那就是编译的.class文件的版本高于java虚拟机的版本
解决办法:
在主机上重新编译,采用jdk1.5
javac -target 1.5 -source 1.5 Hello.java
然后重新拷贝.class文件到板子上,重新测试运行。