@cyysu
2017-09-22T05:39:00.000000Z
字数 8073
阅读 1097
- 时间:2017年8月31日
- 作者:MJ-DZ chen yuan
- 邮箱:chenyuan@ypmingjiang.cn
- 描述:cvm移植arm教程,以及移植需要注意的事项
- 版本:V2.0
嵌入式Linux
本以为这个东西很好移植,但是悲催的是sun公司提供的网址已经不能用了,不是无法访问就是无法找不到,可能需要进行翻墙操作吧,实在是懒得弄这个破玩应,很无聊!为此,找到这个可以用的源码很不容易,下面我会给出我测试过的地址。希望大家可以移植成功。在这里也感谢在网上做贡献的爱好者,也同时建议哪些转载的以及抄袭有点自觉性。本文如果有什么地方不正确之处,欢迎私信交流。
Java ME 是为机顶盒、移动电话和PDA之类嵌入式消费电子设备提供的Java语言平台,包括虚拟机和一系列标准化的Java API。这个标准里面的具有两类虚拟机:1) CVM (C Virtual Machine,C虚拟机)2) KVM (K Virtual Machine,K虚拟机)
链接:http://pan.baidu.com/s/1nvA4Frz 密码:3nm6说明:此文件夹下分为JDK1.4版本和CVM文件,需要更改自己的jdk环境配置,这种玩应自己网上去找吧,在这里写就没有什么意义。原谅我的偷懒吧,下载下来的jdk后缀是.run,这个就可以像我们运行脚本一样进行运行。
解压的目录一定要在纯英文的目录,这个主要是由于这个东西比较老,对中文的支持不是很完美。
解压的目录一定要在纯英文的目录,这个主要是由于这个东西比较老,对中文的支持不是很完美。
解压的目录一定要在纯英文的目录,这个主要是由于这个东西比较老,对中文的支持不是很完美。
查看一下这个目录下有哪些文件mj@DZ:/opt/phoneme_advanced_mr2$ tree -L 1.├── cdc├── jump├── legal├── midp├── pcsl└── tools
mj@DZ:/opt/phoneme_advanced_mr2$ cd cdc/build/linux-arm-generic/mj@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic$ lsbin classes.jcc generated objbtclasses classes.tools GNUmakefile testclassesbtclasses.zip democlasses jcs testclasses.zipcdc_classes democlasses.jar lib zic_classes由于我这里编译过,那么我们在重新编译一次,执行下面命令,清除编译文件。mj@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic$ sudo make clean
mj@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic$ lsGNUmakefileroot@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic# vim GNUmakefile#需要修改的内容如下:# USE_AAPCS is used to tell the source to enable AAPCS calling# conventions rather than APCS. This is usually needed for MontaVista.USE_AAPCS ?= true# For example, if gcc is located at /opt/arm-linux/bin/arm-linux-gcc,# you would use:#CVM_TARGET_TOOLS_PREFIX=/opt/arm-2011.03/bin/arm-none-linux-gnueabi-# CVM_DEFINES: Used to add extra compiler defines. This is used to enable# extra VM features, like supporting Intels WMMX coprocessor and other# optimizations that are not normally enabled.CVM_DEFINES +=-DAAPCS
root@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic# vim ../../src/linux-arm/javavm/runtime/segvhandler_arch.c#需要修改的内容如下/* avoid conflicting ucontext definitions *///#define ucontext asm_ucontext#include <ucontext.h>#如果发现找不到S_ISDIR或者stat,那么修改下面这个文件root@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic# vim /opt/phoneme_advanced_mr2/cdc/src/linux/native/java/lang/UNIXProcess_md.c# 加入这个头文件#include <sys/stat.h>
root@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic# make J2ME_CLASSLIB=foundation# 如果成功编译完在次编译就会出现如下信息touch /opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic/./generated/empty.mkMAKEFLAGS =CVM_HOST = x86_64-Ubuntu-linuxCVM_TARGET = linux-arm-genericSHELL = sh -eHOST_CC = /usr/bin/ccHOST_CCC = /usr/bin/g++ZIP = /usr/bin/zipFLEX = /usr/bin/flexBISON = /usr/bin/bisonCVM_JAVA = /opt/j2sdk1.4.2_11/bin/javaCVM_JAVAC = /opt/j2sdk1.4.2_11/bin/javacCVM_JAVAH = /opt/j2sdk1.4.2_11/bin/javahCVM_JAR = /opt/j2sdk1.4.2_11/bin/jarTARGET_CC = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-gccTARGET_CCC = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-g++TARGET_AS = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-gccTARGET_LD = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-gccTARGET_AR = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-arTARGET_RANLIB = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-ranlibLINKFLAGS = -g -Wl,-export-dynamicLINKLIBS = -lpthread -ldlASM_FLAGS = -c -fno-common -traditionalCCCFLAGS = -fno-rttiCCFLAGS_SPEED = -O4 -c -fno-common -Wall -W -Wno-unused-parameter -Wno-sign-compare -fno-strict-aliasing -fwrapvCCFLAGS_SPACE = -O2 -c -fno-common -Wall -W -Wno-unused-parameter -Wno-sign-compare -fno-strict-aliasing -fwrapvCCFLAGS_LOOP = -O4 -c -fno-common -Wall -W -Wno-unused-parameter -Wno-sign-compare -fno-strict-aliasing -fwrapvCCFLAGS_FDLIB = -O4 -c -fno-common -Wall -W -Wno-unused-parameter -Wno-sign-compare -fno-strict-aliasing -fwrapvJAVAC_OPTIONS = -g:none -J-Xms32m -J-Xmx128m -encoding iso8859-1 -source 1.4 -target 1.4CVM_DEFINES = -DAAPCS -DCVM_OPTIMIZED -DCVM_DEBUG_STACKTRACES -DNDEBUG -DCVM_CLASSLOADING -DCVM_SERIALIZATION -DCVM_REFLECT -DCVM_DYNAMIC_LINKING -DCVM_JIT -DCVM_JIT_REGISTER_LOCALS -DCVM_TIMESTAMPING -DJ2ME_CLASSLIB=cdc -DTARGET_CPU_FAMILY=arm -DCVM_JIT_COPY_CCMCODE_TO_CODECACHE -D_GNU_SOURCE -DCVM_IAI_OPT_ALL -DAAPCShost uname = Linux DZ 4.10.0-32-generic #36~16.04.1-Ubuntu SMP Wed Aug 9 09:19:02 UTC 2017 x86_64 x86_64 x86_64 GNU/LinuxTARGET_CC version = 4.5.2 arm-none-linux-gnueabiHOST_CC version = 5.4.0 x86_64-linux-gnuCVM_JAVA version = java version 1.4.2_11TOOLS_DIR = /opt/phoneme_advanced_mr2/toolsupdating /opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic/./generated/build_defs.mk ...Checking for build-time classes to compile ...make[1]: Entering directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'make[1]: Leaving directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'make[1]: Entering directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'make[1]: Leaving directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'Checking for phoneME Advanced classes to compile ...make[1]: Entering directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'make[1]: Leaving directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'Checking for test classes to compile ...Checking for demo classes to compile ...make CVM_TOOLS_BUILD=true toolsmake[1]: Entering directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'make[1]: Nothing to be done for 'tools'.make[1]: Leaving directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'# 这时我们发现目录下已经有了我们所编译的文件root@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic# lsbin btclasses.zip classes.jcc democlasses generated jcs obj testclasses.zipbtclasses cdc_classes classes.tools democlasses.jar GNUmakefile lib testclasses zic_classes
# 在拷贝之前需要将基础类库放到当前目录下的lib中root@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic# cp btclasses.zip lib/# 将lib文件夹、bin文件夹、以及testclasses测试文件拷到我们的目标板scp -r ./lib/ root@912.168.1.136:/optscp -r ./bin/ root@192.168.1.136:/optscp testclasses.zip root@192.168.1.136:/opt# 以上操作均在PC完成,下面的操作为Cortex-A8 M3352系列板运行[root@M3352 opt]# lsbin/ lib/ testclasses.zip# 执行测试程序[root@M3352 opt]# ./bin/cvm -cp testclasses.zip Test*Number of command line arguments: 0Starting test1...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...link...link...linkStarting test1 again...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...recurse...link...link...linktest6: Caught inner java.lang.NullPointerExceptiontest6: Caught outer java.lang.NullPointerExceptionTesting Array Copy*TestE exception thrown because "I'm feeling Testy"*<clinit> threw java.lang.ExceptionInInitializerError*<clinit> threw java.lang.NoClassDefFoundError: StaticEc1 = class [LTest;c2 = class [[LTest;c3 = class [LC;c4 = class [[LC;c1.modifiers = 1041c2.modifiers = 1041c3.modifiers = 1040c4.modifiers = 1040*FloatMIN =1.4E-45*FloatMAX =3.4028235E38FloatMIN (the int bits) =1FloatMAX (the int bits) =2139095039java.lang.IllegalArgumentException: too many dimensionsat 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'sWoke 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# 查看一下CVM的版本[root@M3352 opt]# ./bin/cvm -versionProduct: phoneME Advanced (phoneme_advanced_mr2-b97)Profile: Foundation Profile Specification 1.1JVM: CVM phoneme_advanced_mr2-b97 (mixed mode)
到此,CVM的移植工作已经完成,下面就开始移植OSGI框架,这里以equinox为例进行移植。详细的内容请转OSGI框架移植篇。