• jvm虚拟机androidy移植-编译篇


    有这个必要吗?都过时的东西了,android上的Dalvik效率不够高吗,不够逼格吗?

    是的但有总东西是不是我们这些码农能决定的,领导和项目需求才是你要关心的,毕竟工作要向领导汇报,项目要去挣钱钱,但挣了money你也只有工资,就这么现实。

    言归正传,发发牢骚可以,但是干活还得继续。

    我们肯定不去造轮子,那样太累。还是借助开源来完成我们的功能,经过google找到了一个好的的开源jvm, PhoneMe sun开源的java虚拟机。

    PhoneME简介

    phoneME Feature software是一个优化了的Java ME架构。它的核心是支持多任务的MIDP2.1规范实现。当phoneME Feature software运行多个MIDlet时,它只使用一个系统进程,因为一个Java虚拟机实例可以执行几个应用,并提供独立的运行时空间。所有运行的应用都是独立的,看起来好象每个应用都在自己的虚拟机中执行一样。

           phoneME Feature software提供给为MIDP或者是移动信息设备相关的开发人员。
           以下是phoneME Feature software MR2版本包含的内容特性:
    l         高性能的Java ME平台架构
    l         支持每个功能领域(存储,网络和用户界面等)的模块化实现
    l         子系统,目录和便携性类库
    l         最小的特定平台实现代码
    l         多任务能力和支持并发应用(MIDlet)
    l         本地应用管理API
    l         本地资源管理API
    l         支持德州仪器P2SAMPLE64-V6平台
    l         CLDC 1.1 (JSR 139)和MIDP 2.1 (JSR 118)实现
    l         以下可选包实现:
    n         Wireless Messaging 1.0 (JSR 120)
    n         Mobile Media APIs (JSR 135)
    n         J2ME™ Web Services support (JSR 172)
    n         Security and Trust Services API support (JSR 177)
    n         Content Handler API (JSR 211)

    n       Java Binding for the OpenGL ES API (JSR 239)

    这个是Feature版本这是未设备资源较少的设备优化的,但是我们是在android下,它是智能设备了所以我们选择advanced版本这个版本支持智能设备。下面我们就一步一步来把它移植到android上。

    一、源码版本下载

    #!/bin/bash
    svn checkout https://svn.java.net/svn/phoneme~svn/legal legal --username guest
    for i in abstractions cdc cldc javacall jpeg jsr120 jsr135 jsr172 jsr177 jsr211 jsr239 jsr280 jump kdp lime midp midp_abb pcsl pisces preverifier restricted_crypto tools xmlparser;
    do
        svn checkout https://svn.java.net/svn/phoneme~svn/components/$i/trunk $i --username guest
    done
    这个是最后更新的版本,及为最新版本,不过是四年前更新的。

    二、结构说明

    1、JavaCall API移植层:该层提取目标平台的需求,实现必须移植的函数集,是基于目标平台的实现。pho-neME advanced的主要移植工作集中于此层。

    2、MIDP/CLC层:是嵌入式Java虚拟机的核心部分。其中CDC为资源受限的设备定义了应用编程接口和虚拟机的基础函数集,MIDP(Mobile Information Device Profile,移动信息设备简表)则提供应用程序环境和应用程序所需的大量服务。

    3、PCSL(Portable Common Services Library,可移植的通用服务库)层:提供底层服务,供CDC、MIDP和其他可选包调用。

    4、抽象层:是一套函数集,所有扩展JSR包通过抽象层接口与MIDP/CDC层进行交互。

    5、扩展JSR包:为虚拟机提供扩展功能。扩展JSR包种类很多,可根据需要进行扩展。如支持蓝牙和OBEX(对象交换)功能的JSR82扩展包、支持Web服务的JSR172包、支持定位功能的JSR179包、支持在线支付功能的JSR229包等。

    Java虚拟机的移植首先要确定两件事:一是目标CPU,二是目标OS(操作系统)。OS移植比较简单,移植工作集中在虚拟机自身和核心CLDC库上;而CPU移植则较为复杂,因为汇编解释器和适配的编译器十分依赖于目标CPU架构。

    二、编译配置

    #!/bin/bash
    export CVM_TARGET_TOOLS_PREFIX=
    export GNU_TOOLS_DIR=
    export WORK_DIR=$PWD
    export COMPONENTS_DIR=$WORK_DIR
    export JAVA_HOME=
    export JAVA_PATH=$JAVA_HOME
    export JDK_HOME=$JAVA_HOME
    export PATH=$JAVA_HOME:$PATH
    export CVM_JAVABIN=$JAVA_HOME/bin
    export BUILD_OUTPUT_DIR=$COMPONENTS_DIR/output


    ############################################################
    export CVM_PRELOAD_LIB=true
    export JAVAME_LEGAL_DIR=$PWD/legal
    export PATH=$JAVA_HOME:$PATH
    export CVM_DEBUG=false
    export CVM_JIT=true
    export CVM_BUILD_SO=true
    export USE_AAPCS=true
    export J2ME_CLASSLIB=foundation
    #export CVM_PRELOAD_LIB=true
    export TOOLS_DIR=$WORK_DIR/tools
    export CVM_BUILD_SUBDIR=true
    export CVM_BUILD_SUBDIR_NAME=phoneme-advanced
    export PCSL_PLATFORM=linux_arm_gcc
    export USE_MIDP=true
    export USE_JPEG=true


    # Multimedia Subsystem
    # Description: Mobile Media API                                                                                                                   
    export JPEG_DIR=$COMPONENTS_DIR/jpeg

    export ANDROID_SYSROOT=
    export CPPFLAGS="--sysroot=$ANDROID_SYSROOT"
    export CFLAGS="--sysroot=$ANDROID_SYSROOT"
    export CXXFLAGS="--sysroot=$ANDROID_SYSROOT"
    export EXTRA_CFLAGS=$CFLAGS

    echo "CVM_TARGET_TOOLS_PREFIX=$CVM_TARGET_TOOLS_PREFIX" >> cdc/build/linux-arm-generic/GNUmakefile
    cd cdc/build/linux-arm-generic
    make -f GNUmakefile bin VERBOSE_BUILD=true USE_VERBOSE_MAKE=true $@

    CVM_TARGET_TOOLS_PREFIX 编译环境目录ndk目录我用的是android-ndk-r9d

    JAVA_HOME 为jdk环境目录

    ANDROID_SYSROOT 为ndk 下的arch-arm目录

    正常情况下会遇到一些错误,基本上是android与linux差异导致的改掉它就行

    一切正常的话就会在cdc/build/linux-arm-generic下生成foundation目录里面有可执行文件cvm。

    此时的jvm只能在命令行运行一些测试例子。

    bin/cvm -cp testclasses.zip Test

    今天就到这,下一篇我们将介绍将它编译成库在android 上调用,以及port接口如何实现等。

    如果大家对本系列文章有疑问,可以直接在公众号留言,小编第一时间联系原创作者帮你耐心解答。

    技术人员都有自己的情怀,深陷其中而不被理解,欢迎关注个人微信公众平台:程序员互动联盟(coder_online),一个开发人员的家,来诉说自己的故事。

     
     
  • 相关阅读:
    控制器的功能和工作原理
    数据通路的功能和基本结构
    指令的执行过程
    CPU的功能和基本组成结构
    CSS介绍
    html内容
    web简单介绍
    事务隔离机制介绍
    多版本并发控制MVCC
    数据库锁机制
  • 原文地址:https://www.cnblogs.com/lonelyonline/p/4448813.html
Copyright © 2020-2023  润新知