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 [email protected]

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),一个开发人员的家,来诉说自己的故事。

时间: 2024-08-05 07:08:34

jvm虚拟机androidy移植-编译篇的相关文章

FFmpeg的Android平台移植—编译篇

摘要:本文主要介绍将FFmpeg音视频编解码库移植到Android平台上的编译和基本测试过程. 环境准备: ubuntu-12.04.5 android-ndk64-r10-linux-x86_64.tar.tar ffmpeg-2.7.2_tmp.tar.bz2 adt-bundle-windows-x86_64-20131030.zip 第一步:源代码下载 到FFmpeg官方网站http://www.ffmpeg.org/上去下载源代码,这里下载的源代码是最权威的.进入官网之后,选择”Dow

深入了解JVM虚拟机8:Java的编译期优化与运行期优化

java编译期优化 微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,更有数据库.分布式.微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南.

初谈JVM虚拟机

学了这么久的Java,一直听说JVM虚拟机是运行所有java程序,但是不知道具体内部结构是怎样,以及它的运行机制是什么.今天刚好看到一篇文章,索性就开始学习. JVM的主要结构: 由上图可以看出,Jvm主要组成有:类加载器.运行数据区.执行引擎.本地方法接口组成.其中运行数据区包含子模块方法区.堆.Java栈.本地方法栈以及寄存器.对于方法区.堆是对所有线程共享的,而其他则是属于当前线程私有. 下面开始一步步剖析JVM........... 1.类加载器(Class loader) 类加载器负责

【JVM虚拟机】(6)---深入理解Class中访问标志、类索引、父类索引、接口索引

JVM(6)访问标志,类索引 上一篇博客讲[JVM虚拟机](5)---深入理解JVM-Class中常量池 我们知道一个class文件正常可以分为7个部分: 魔数与class文件版本 常量池 访问标志 类索引.父类索引.接口索引 字段表集合 方法表集合 属性表集合 那么这篇博客主要讲有关 访问标志 和 类索引.父类索引.接口索引 相关的理解和代码示例. 先通俗的说下这两个的作用: 访问标志: 告知该类是一个什么类型的类,是普通类?还是接口?还是枚举?或者其它类,是用什么修饰符修饰该类的. 类索引.

【JVM虚拟机】(7)---深入理解Class中-属性集合

#[JVM虚拟机](7)---深入理解Class中-属性集合 之前有关class文件已经写了两篇博客: 1.[JVM虚拟机](5)---深入理解JVM-Class中常量池 2.[JVM虚拟机](6)---深入理解Class中访问标志.类索引.父类索引.接口索引 那么这篇博客主要讲有关 字段表集合 相关的理解和代码示例. 字段表:用于描述接口或者类中声明的变量,字段包括类级(static修饰)变量以及实例级变量,但是不包括局部变量(方法内部变量). 一.概念 字段表集合:包括了字段计数器和字段数据

【JVM虚拟机】(8)--深入理解Class中--方法、属性表集合

#[JVM虚拟机](8)--深入理解Class中--方法.属性表集合 之前有关class文件已经写了两篇博客: 1.[JVM虚拟机](5)---深入理解JVM-Class中常量池 2.[JVM虚拟机](6)---深入理解Class中访问标志.类索引.父类索引.接口索引 3.[JVM虚拟机](7)---深入理解Class中-属性集合 那么这篇博客主要讲有关 方法表集合 相关的理解和代码示例. 方法表集合: 告知该方法是什么修饰符修饰?是否有方法值?返回类型是什么?方法名称,方法参数,还有就是方法内

【JVM虚拟机】(9)-- JVM是如何处理异常的

[JVM虚拟机](9)-- JVM是如何处理异常的 上篇博客我们简单说过异常信息是存放在属性表集合中的Code属性表里,那么这篇博客就单独讲Code属性表中的exception_table. 在讲之前我们先思考两个问题? 1.为什么捕获异常会较大的性能消耗? 2.为什么finally中的代码会永远执行? 接下来会从JVM虚拟机的角度来解答这两个问题. 一.概念 1.JVM是如何捕获异常的? 1.编译而成的字节码中,每个方法都附带一个异常表. 2.异常表中每一个条目代表一个异常处理器 3.触发异常

深入理解JVM虚拟机开篇:JVM介绍与知识脉络梳理

微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,更有数据库.分布式.微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南.Java程序员面试指

深入理解JVM虚拟机7:JNDI,OSGI,Tomcat类加载器实现

打破双亲委派模型 JNDI JNDI 的理解 JNDI是 Java 命名与文件夹接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之中的一个,不少专家觉得,没有透彻理解JNDI的意义和作用,就没有真正掌握J2EE特别是EJB的知识. 那么,JNDI究竟起什么作用?//带着问题看文章是最有效的 要了解JNDI的作用,我们能够从“假设不用JNDI我们如何做?用了JNDI后我们又将如何做?”这个问题来探讨. 没有JNDI的做法: 程序猿开发时,