jvm虚拟机android移植-编译篇

有这个必要吗?都过时的东西了,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版本。

一、源码版本下载

#!/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 为java jdk环境目录

ANDROID_SYSROOT 为ndk 下的arch-arm目录

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

一切正常的话就会在cdc/build/linux-arm-generic下生成foundation目录,

里面有可执行文件cvm。

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

bin/cvm -cp testclasses.zip Test

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-04-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沈玉琛的专栏

那些年,我们一起误解过的REST

最近几年REST API越来越流行,特别是随着微服务的概念被广泛接受和应用,很多Web Service都使用了REST API。

93914
来自专栏JavaQ

Java研发方向如何准备BAT技术面试答案(中)

抱歉来晚了!由于最近事比较多,拖了一段时间,答案本想自己写的,但是时间不允许,挤时间整理了部分答案,后面我会继续更新,谢谢关注。 51.servlet生命周期及...

2966
来自专栏aCloudDeveloper

OVS 总体架构、源码结构及数据流程全面解析

在前文「从 Bridge 到 OVS」中,我们已经对 OVS 进行了一番探索。本文决定从 OVS 的整体架构到各个组件都进行一个详细的介绍。 OVS 架构 OV...

2675
来自专栏码匠的流水账

java10系列(一)Time-Based Release Versioning

本文主要解读下java10的Time-Based Release Versioning

331
来自专栏云计算

如何让你的微服务保持稳定

在用微服务工作时,我们通常还需要在本地进行一些开发,这可能是一个痛点。在本篇文章中,我们将探讨一个可能有效的解决方案。

1272
来自专栏zhisheng

Java研发方向如何准备BAT技术面试答案(中)

JavaEE: 1.servlet生命周期及各个方法 参考文章 http://www.cnblogs.com/xuekyo/archive/2013/02/2...

38613
来自专栏IT技术精选文摘

我们是如何优化HAProxy以让其支持200万个并发SSL连接的?

仔细上上图,我们可以发现两个信息: 该机器建立了238万个TCP连接; 此时内存使用量大约在48G左右。 看上去很赞吧?如果有人能够提供配置,并且在单台部署HA...

4828
来自专栏杨建荣的学习笔记

Datapump数据迁移前的准备工作(二)(r9笔记第59天)

之前写了一篇文章分析了Datapump迁移数据的一些准备总结,反响还不错。Datapump数据迁移前的准备工作,最近碰到一个场景,根据评估还是使用Datapum...

2644
来自专栏CSDN技术头条

为Symfony2和Redis正名,基于PHP的10亿请求/周网站打造

【编者按】如果你还在Symfony2和Redis使用中存在这样的错误观念:不能使用Redis作为主要存储;Symfony2的功能很多,以至于它的运行很慢,那么不...

1835
来自专栏网络

装逼必备:大型分布式网站术语分析

来自: 朱小厮的博客 程序猿自媒体已获转载授权 1、I/O优化 1、增加缓存,减少磁盘的访问次数。 2、优化磁盘的管理系统,设计最优的磁盘方式策略,以及磁盘的寻...

1779

扫描关注云+社区