@cyysu
2017-09-22T05:39:00.000000Z
字数 8073
阅读 988
- 时间: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$ ls
bin classes.jcc generated obj
btclasses classes.tools GNUmakefile testclasses
btclasses.zip democlasses jcs testclasses.zip
cdc_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$ ls
GNUmakefile
root@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.mk
MAKEFLAGS =
CVM_HOST = x86_64-Ubuntu-linux
CVM_TARGET = linux-arm-generic
SHELL = sh -e
HOST_CC = /usr/bin/cc
HOST_CCC = /usr/bin/g++
ZIP = /usr/bin/zip
FLEX = /usr/bin/flex
BISON = /usr/bin/bison
CVM_JAVA = /opt/j2sdk1.4.2_11/bin/java
CVM_JAVAC = /opt/j2sdk1.4.2_11/bin/javac
CVM_JAVAH = /opt/j2sdk1.4.2_11/bin/javah
CVM_JAR = /opt/j2sdk1.4.2_11/bin/jar
TARGET_CC = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-gcc
TARGET_CCC = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-g++
TARGET_AS = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-gcc
TARGET_LD = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-gcc
TARGET_AR = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-ar
TARGET_RANLIB = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-ranlib
LINKFLAGS = -g -Wl,-export-dynamic
LINKLIBS = -lpthread -ldl
ASM_FLAGS = -c -fno-common -traditional
CCCFLAGS = -fno-rtti
CCFLAGS_SPEED = -O4 -c -fno-common -Wall -W -Wno-unused-parameter -Wno-sign-compare -fno-strict-aliasing -fwrapv
CCFLAGS_SPACE = -O2 -c -fno-common -Wall -W -Wno-unused-parameter -Wno-sign-compare -fno-strict-aliasing -fwrapv
CCFLAGS_LOOP = -O4 -c -fno-common -Wall -W -Wno-unused-parameter -Wno-sign-compare -fno-strict-aliasing -fwrapv
CCFLAGS_FDLIB = -O4 -c -fno-common -Wall -W -Wno-unused-parameter -Wno-sign-compare -fno-strict-aliasing -fwrapv
JAVAC_OPTIONS = -g:none -J-Xms32m -J-Xmx128m -encoding iso8859-1 -source 1.4 -target 1.4
CVM_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 -DAAPCS
host 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/Linux
TARGET_CC version = 4.5.2 arm-none-linux-gnueabi
HOST_CC version = 5.4.0 x86_64-linux-gnu
CVM_JAVA version = java version 1.4.2_11
TOOLS_DIR = /opt/phoneme_advanced_mr2/tools
updating /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 tools
make[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# ls
bin btclasses.zip classes.jcc democlasses generated jcs obj testclasses.zip
btclasses 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:/opt
scp -r ./bin/ root@192.168.1.136:/opt
scp testclasses.zip root@192.168.1.136:/opt
# 以上操作均在PC完成,下面的操作为Cortex-A8 M3352系列板运行
[root@M3352 opt]# ls
bin/ lib/ testclasses.zip
# 执行测试程序
[root@M3352 opt]# ./bin/cvm -cp testclasses.zip Test
*Number of command line arguments: 0
Starting 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
...link
Starting 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
...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
# 查看一下CVM的版本
[root@M3352 opt]# ./bin/cvm -version
Product: phoneME Advanced (phoneme_advanced_mr2-b97)
Profile: Foundation Profile Specification 1.1
JVM: CVM phoneme_advanced_mr2-b97 (mixed mode)
到此,CVM的移植工作已经完成,下面就开始移植OSGI框架,这里以equinox为例进行移植。详细的内容请转OSGI框架移植篇。