移植JAVA虚拟机CVM到ARM平台(收藏)

J2ME CDC(Connected Device Configuration,连接式设备配置集)
使用CVM,面向那些具有更强计算能力的嵌入式设备,包含了Java类库的核心部分,是应用Java技术在嵌入式设备上进行开发所需类库的最小集合。
它具有如下优点:
高级网络特性:CDC位基于套接字的网络编程技术提供了最新Java API
满足Jini技术的需求:基于CDC远程方法调用(RMI)可选包可实现对基于完全Jini技术的设备支持。
方便的移植:CDC的Foundation Profile(基础描述集)核心类库包括了广为使用的java.lang、java.net、java.io、java.util、java.security和java.text包
清除了deprecated方法:程序更安全、易于理解
可以利用更高级的包进行扩展,比如说Personal Basis Profile(PBP个人基础描述集)和Personal Profile(PP个人描述集)等。
CDC向小型设备展现了大量的Java 2技术,与Jini技术的结合提高了设备的灵活性,以及能够不断进化发展的能力,实现即插即用,分布计算等等。
CDC对资源的要求:
内存:2MB ROM、512KB RAM
处理器:32位CPU
网络连接能力:至少支持UDP,附加的profile可添加对TCP/IP的完全支持
用户界面:没有支持图形用户的GUI,可添加描述集实现。


一、选用sun的phoneme
   https://phoneme.dev.java.net/

二、下载
   http://download.java.net/mobileembedded/phoneme/advanced/phoneme_advanced-mr2-dev-src-b97-20_nov_2008.zip

三、解压
   unzip phoneme_advanced-mr2-dev-src-b97-20_nov_2008.zip

四、修改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

五、输出PATH
   export PATH=/usr/local/arm/4.3.2/bin/:$PATH                     为自己的交叉编译器的地址

六、编译
   make

七、如果是使用ubuntu的朋友,可能要安装sun-java6-jdk和另外的一两个工具
   Java SDK安装配置
   http://wiki.ubuntu.org.cn/Java%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE

   另外的一两个工具可以通过 apt-get install 来安装(出错时会提醒的了,具体我忘了,没有记录)

八、出错
   ../../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>
   为
   //#define ucontext asm_ucontext     //注释掉这句
   #include <ucontext.h>            //去掉arm/

九、编译
   make

   编译成功!

   ls
   可以看到在当前目录有
   bin   lib   testclasses.zip

十、测试
   1)、拷贝上面三个文件与文件夹到开发板/home/j2me目录

    2)、在开发板/etc/init.d/rcS文件里加入如下
        JAVA_HOME=/home/j2me
        export PATH=$JAVA_HOME/bin:$PATH
        export CLASSPATH=.:$JAVA_HOME/lib

   3)、经典的HelloWorld
       cd /home/j2me/bin
       ./cvm -cp ../testclasses 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 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

        *CONGRATULATIONS: test Test completed with 411 tests passed and 0 failures
        这句话意味着什么,我就不说了~~ 恭喜你!


 

---------------------------------------

我的补充:
GNUmakefile里有两个USE_AAPCS ,都要改成false
否则运行时报
Java VM panic: AAPCS calling convention used; compilation must use -DAAPCS

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我无法找到关于CVM检验python的具体信息。但是,根据引用中提到的腾讯云CVM API,可以通过调用接口实现CVM的停止、启动和重启。如果你想了解如何使用Python调用腾讯云CVM API进行操作,可以参考以下步骤: 1. 首先,你需要在腾讯云官网上创建一个账号,并获取到你的secretId和secretKey。这些信息将用于进行API鉴权。 2. 安装腾讯云SDK,可以使用pip命令进行安装: ```shell pip install tencentcloud-sdk-python ``` 3. 创建一个Python脚本,导入腾讯云SDK并进行API调用。以下是一个简单的示例代码,用于停止一个CVM实例: ```python from tencentcloud.common import credential from tencentcloud.common.profile.client_profile import ClientProfile from tencentcloud.common.profile.http_profile import HttpProfile from tencentcloud.cvm.v20170312 import cvm_client, models # 设置secretId和secretKey cred = credential.Credential("your-secretId", "your-secretKey") # 实例化一个http选项,可选的,没有特殊需求可以跳过 httpProfile = HttpProfile() httpProfile.endpoint = "cvm.tencentcloudapi.com" # 实例化一个client选项,可选的,没有特殊需求可以跳过 clientProfile = ClientProfile() clientProfile.httpProfile = httpProfile # 实例化要请求产品的client对象,clientProfile是可选的 client = cvm_client.CvmClient(cred, "ap-guangzhou", clientProfile) # 实例化一个请求对象 req = models.StopInstancesRequest() # 设置请求参数 params = { "InstanceIds": ["ins-xxxxxx"] # 要停止的CVM实例ID } req.from_json_string(json.dumps(params)) # 发起请求并获取响应 resp = client.StopInstances(req) # 打印响应结果 print(resp.to_json_string()) ``` 请注意,上述代码中的"your-secretId"和"your-secretKey"需要替换为你自己的secretId和secretKey,"ins-xxxxxx"需要替换为你要操作的CVM实例ID。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值