[关闭]
@cyysu 2017-09-22T05:39:00.000000Z 字数 8073 阅读 988

CVM移植ARM-LINUX篇

  • 时间:2017年8月31日
  • 作者:MJ-DZ chen yuan
  • 邮箱:chenyuan@ypmingjiang.cn
  • 描述:cvm移植arm教程,以及移植需要注意的事项
  • 版本:V2.0

嵌入式Linux


前言

  1. 本以为这个东西很好移植,但是悲催的是sun公司提供的网址已经不能用了,不是无法访问就是无法找不到,可能需要进行翻墙操作吧,实在是懒得弄这个破玩应,很无聊!为此,找到这个可以用的源码很不容易,下面我会给出我测试过的地址。希望大家可以移植成功。在这里也感谢在网上做贡献的爱好者,也同时建议哪些转载的以及抄袭有点自觉性。本文如果有什么地方不正确之处,欢迎私信交流。

开篇的话

  1. Java ME 是为机顶盒、移动电话和PDA之类嵌入式消费电子设备提供的Java语言平台,包括虚拟机和一系列标准化的Java API。这个标准里面的具有两类虚拟机:
  2. 1) CVM (C Virtual MachineC虚拟机)
  3. 2) KVM (K Virtual MachineK虚拟机)

软件地址以及注意事项

  1. 链接:http://pan.baidu.com/s/1nvA4Frz 密码:3nm6
  2. 说明:此文件夹下分为JDK1.4版本和CVM文件,需要更改自己的jdk环境配置,这种玩应自己网上去找吧,在这里写就没有什么意义。原谅我的偷懒吧,下载下来的jdk后缀是.run,这个就可以像我们运行脚本一样进行运行。

CVM文件说明

解压的目录一定要在纯英文的目录,这个主要是由于这个东西比较老,对中文的支持不是很完美。
解压的目录一定要在纯英文的目录,这个主要是由于这个东西比较老,对中文的支持不是很完美。
解压的目录一定要在纯英文的目录,这个主要是由于这个东西比较老,对中文的支持不是很完美。

  1. 查看一下这个目录下有哪些文件
  2. mj@DZ:/opt/phoneme_advanced_mr2$ tree -L 1
  3. .
  4. ├── cdc
  5. ├── jump
  6. ├── legal
  7. ├── midp
  8. ├── pcsl
  9. └── tools

编译说明

NO.1 进入makefile目录

  1. mj@DZ:/opt/phoneme_advanced_mr2$ cd cdc/build/linux-arm-generic/
  2. mj@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic$ ls
  3. bin classes.jcc generated obj
  4. btclasses classes.tools GNUmakefile testclasses
  5. btclasses.zip democlasses jcs testclasses.zip
  6. cdc_classes democlasses.jar lib zic_classes
  7. 由于我这里编译过,那么我们在重新编译一次,执行下面命令,清除编译文件。
  8. mj@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic$ sudo make clean

NO.2 修改Makefile

  1. mj@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic$ ls
  2. GNUmakefile
  3. root@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic# vim GNUmakefile
  4. #需要修改的内容如下:
  5. # USE_AAPCS is used to tell the source to enable AAPCS calling
  6. # conventions rather than APCS. This is usually needed for MontaVista.
  7. USE_AAPCS ?= true
  8. # For example, if gcc is located at /opt/arm-linux/bin/arm-linux-gcc,
  9. # you would use:
  10. #
  11. CVM_TARGET_TOOLS_PREFIX=/opt/arm-2011.03/bin/arm-none-linux-gnueabi-
  12. # CVM_DEFINES: Used to add extra compiler defines. This is used to enable
  13. # extra VM features, like supporting Intels WMMX coprocessor and other
  14. # optimizations that are not normally enabled.
  15. CVM_DEFINES +=-DAAPCS

NO.3 修改其他文件

  1. root@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic# vim ../../src/linux-arm/javavm/runtime/segvhandler_arch.c
  2. #需要修改的内容如下
  3. /* avoid conflicting ucontext definitions */
  4. //#define ucontext asm_ucontext
  5. #include <ucontext.h>
  6. #如果发现找不到S_ISDIR或者stat,那么修改下面这个文件
  7. 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
  8. # 加入这个头文件
  9. #include <sys/stat.h>

NO.4 开始执行编译

  1. root@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic# make J2ME_CLASSLIB=foundation
  2. # 如果成功编译完在次编译就会出现如下信息
  3. touch /opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic/./generated/empty.mk
  4. MAKEFLAGS =
  5. CVM_HOST = x86_64-Ubuntu-linux
  6. CVM_TARGET = linux-arm-generic
  7. SHELL = sh -e
  8. HOST_CC = /usr/bin/cc
  9. HOST_CCC = /usr/bin/g++
  10. ZIP = /usr/bin/zip
  11. FLEX = /usr/bin/flex
  12. BISON = /usr/bin/bison
  13. CVM_JAVA = /opt/j2sdk1.4.2_11/bin/java
  14. CVM_JAVAC = /opt/j2sdk1.4.2_11/bin/javac
  15. CVM_JAVAH = /opt/j2sdk1.4.2_11/bin/javah
  16. CVM_JAR = /opt/j2sdk1.4.2_11/bin/jar
  17. TARGET_CC = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-gcc
  18. TARGET_CCC = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-g++
  19. TARGET_AS = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-gcc
  20. TARGET_LD = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-gcc
  21. TARGET_AR = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-ar
  22. TARGET_RANLIB = /opt/arm-2011.03/bin/arm-none-linux-gnueabi-ranlib
  23. LINKFLAGS = -g -Wl,-export-dynamic
  24. LINKLIBS = -lpthread -ldl
  25. ASM_FLAGS = -c -fno-common -traditional
  26. CCCFLAGS = -fno-rtti
  27. CCFLAGS_SPEED = -O4 -c -fno-common -Wall -W -Wno-unused-parameter -Wno-sign-compare -fno-strict-aliasing -fwrapv
  28. CCFLAGS_SPACE = -O2 -c -fno-common -Wall -W -Wno-unused-parameter -Wno-sign-compare -fno-strict-aliasing -fwrapv
  29. CCFLAGS_LOOP = -O4 -c -fno-common -Wall -W -Wno-unused-parameter -Wno-sign-compare -fno-strict-aliasing -fwrapv
  30. CCFLAGS_FDLIB = -O4 -c -fno-common -Wall -W -Wno-unused-parameter -Wno-sign-compare -fno-strict-aliasing -fwrapv
  31. JAVAC_OPTIONS = -g:none -J-Xms32m -J-Xmx128m -encoding iso8859-1 -source 1.4 -target 1.4
  32. 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
  33. 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
  34. TARGET_CC version = 4.5.2 arm-none-linux-gnueabi
  35. HOST_CC version = 5.4.0 x86_64-linux-gnu
  36. CVM_JAVA version = java version 1.4.2_11
  37. TOOLS_DIR = /opt/phoneme_advanced_mr2/tools
  38. updating /opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic/./generated/build_defs.mk ...
  39. Checking for build-time classes to compile ...
  40. make[1]: Entering directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'
  41. make[1]: Leaving directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'
  42. make[1]: Entering directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'
  43. make[1]: Leaving directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'
  44. Checking for phoneME Advanced classes to compile ...
  45. make[1]: Entering directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'
  46. make[1]: Leaving directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'
  47. Checking for test classes to compile ...
  48. Checking for demo classes to compile ...
  49. make CVM_TOOLS_BUILD=true tools
  50. make[1]: Entering directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'
  51. make[1]: Nothing to be done for 'tools'.
  52. make[1]: Leaving directory '/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic'
  53. # 这时我们发现目录下已经有了我们所编译的文件
  54. root@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic# ls
  55. bin btclasses.zip classes.jcc democlasses generated jcs obj testclasses.zip
  56. btclasses cdc_classes classes.tools democlasses.jar GNUmakefile lib testclasses zic_classes

NO.5 拷贝文件到arm板

  1. # 在拷贝之前需要将基础类库放到当前目录下的lib中
  2. root@DZ:/opt/phoneme_advanced_mr2/cdc/build/linux-arm-generic# cp btclasses.zip lib/
  3. # 将lib文件夹、bin文件夹、以及testclasses测试文件拷到我们的目标板
  4. scp -r ./lib/ root@912.168.1.136:/opt
  5. scp -r ./bin/ root@192.168.1.136:/opt
  6. scp testclasses.zip root@192.168.1.136:/opt
  7. # 以上操作均在PC完成,下面的操作为Cortex-A8 M3352系列板运行
  8. [root@M3352 opt]# ls
  9. bin/ lib/ testclasses.zip
  10. # 执行测试程序
  11. [root@M3352 opt]# ./bin/cvm -cp testclasses.zip Test
  12. *Number of command line arguments: 0
  13. Starting test1
  14. ...recurse
  15. ...recurse
  16. ...recurse
  17. ...recurse
  18. ...recurse
  19. ...recurse
  20. ...recurse
  21. ...recurse
  22. ...recurse
  23. ...recurse
  24. ...recurse
  25. ...recurse
  26. ...recurse
  27. ...recurse
  28. ...recurse
  29. ...recurse
  30. ...recurse
  31. ...recurse
  32. ...recurse
  33. ...recurse
  34. ...recurse
  35. ...recurse
  36. ...recurse
  37. ...recurse
  38. ...recurse
  39. ...link
  40. ...link
  41. ...link
  42. Starting test1 again
  43. ...recurse
  44. ...recurse
  45. ...recurse
  46. ...recurse
  47. ...recurse
  48. ...recurse
  49. ...recurse
  50. ...recurse
  51. ...recurse
  52. ...recurse
  53. ...recurse
  54. ...recurse
  55. ...recurse
  56. ...recurse
  57. ...recurse
  58. ...recurse
  59. ...recurse
  60. ...recurse
  61. ...recurse
  62. ...recurse
  63. ...recurse
  64. ...recurse
  65. ...recurse
  66. ...recurse
  67. ...recurse
  68. ...link
  69. ...link
  70. ...link
  71. test6: Caught inner java.lang.NullPointerException
  72. test6: Caught outer java.lang.NullPointerException
  73. Testing Array Copy
  74. *TestE exception thrown because "I'm feeling Testy"
  75. *<clinit> threw java.lang.ExceptionInInitializerError
  76. *<clinit> threw java.lang.NoClassDefFoundError: StaticE
  77. c1 = class [LTest;
  78. c2 = class [[LTest;
  79. c3 = class [LC;
  80. c4 = class [[LC;
  81. c1.modifiers = 1041
  82. c2.modifiers = 1041
  83. c3.modifiers = 1040
  84. c4.modifiers = 1040
  85. *FloatMIN =1.4E-45
  86. *FloatMAX =3.4028235E38
  87. FloatMIN (the int bits) =1
  88. FloatMAX (the int bits) =2139095039
  89. java.lang.IllegalArgumentException: too many dimensions
  90. at java.lang.reflect.Array.multiNewArray(Native Method)
  91. at java.lang.reflect.Array.newInstance(Unknown Source)
  92. at Test.testDeepArrayConstruction(Unknown Source)
  93. at Test.main(Unknown Source)
  94. at sun.misc.CVM.runMain(Unknown Source)
  95. Constructed an object of type [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[LTest;
  96. finally!
  97. Requesting GC with a latency request of 2 seconds
  98. (Turning GC tracing on)
  99. Sleeping 5 seconds, and waiting for GC's
  100. Woke up! Cancelling latency request
  101. .............
  102. *CONGRATULATIONS: test Test completed with 411 tests passed and 0 failures
  103. *Output lines starting with a * should be checked for correctness
  104. *They can be compared to src/share/javavm/test/TestExpectedResult
  105. # 查看一下CVM的版本
  106. [root@M3352 opt]# ./bin/cvm -version
  107. Product: phoneME Advanced (phoneme_advanced_mr2-b97)
  108. Profile: Foundation Profile Specification 1.1
  109. JVM: CVM phoneme_advanced_mr2-b97 (mixed mode)

NO.6 结束语

  1. 到此,CVM的移植工作已经完成,下面就开始移植OSGI框架,这里以equinox为例进行移植。详细的内容请转OSGI框架移植篇。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注