jvm虚拟机androidy移植-编译篇
有这个必要吗?都过时的东西了,android上的Dalvik效率不够高吗,不够逼格吗?
是的但有总东西是不是我们这些码农能决定的,领导和项目需求才是你要关心的,毕竟工作要向领导汇报,项目要去挣钱钱,但挣了money你也只有工资,就这么现实。
言归正传,发发牢骚可以,但是干活还得继续。
我们肯定不去造轮子,那样太累。还是借助开源来完成我们的功能,经过google找到了一个好的的开源jvm, PhoneMe sun开源的java虚拟机。
PhoneME简介
phoneME Feature software是一个优化了的Java ME架构。它的核心是支持多任务的MIDP2.1规范实现。当phoneME Feature software运行多个MIDlet时,它只使用一个系统进程,因为一个Java虚拟机实例可以执行几个应用,并提供独立的运行时空间。所有运行的应用都是独立的,看起来好象每个应用都在自己的虚拟机中执行一样。
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),一个开发人员的家,来诉说自己的故事。

jvm虚拟机androidy移植-编译篇的更多相关文章
- jvm虚拟机笔记<五> 编译期优化
JVM的编译器可以分为三个编译器: 1.前端编译器:把.java转变为.class的过程.如Sun的Javac.Eclipse JDT中的增量式编译器(ECJ). 2.JIT编译器:把字节码转变为机器 ...
- FFmpeg的Android平台移植—编译篇
摘要:本文主要介绍将FFmpeg音视频编解码库移植到Android平台上的编译和基本测试过程. 环境准备: ubuntu-12.04.5 android-ndk64-r10-linux-x86_64. ...
- [转帖]java架构之路-(面试篇)JVM虚拟机面试大全
java架构之路-(面试篇)JVM虚拟机面试大全 https://www.cnblogs.com/cxiaocai/p/11634918.html 下文连接比较多啊,都是我过整理的博客,很多答案都 ...
- 深入了解JVM虚拟机8:Java的编译期优化与运行期优化
java编译期优化 java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程:1.前端编译:把.java文件转变为.class文件2.后端编译:把字节码转变为机器码3.静态提前编译: ...
- 【JVM虚拟机】(9)-- JVM是如何处理异常的
[JVM虚拟机](9)-- JVM是如何处理异常的 上篇博客我们简单说过异常信息是存放在属性表集合中的Code属性表里,那么这篇博客就单独讲Code属性表中的exception_table. 在讲之前 ...
- 【JVM虚拟机】(8)--深入理解Class中--方法、属性表集合
#[JVM虚拟机](8)--深入理解Class中--方法.属性表集合 之前有关class文件已经写了两篇博客: 1.[JVM虚拟机](5)---深入理解JVM-Class中常量池 2.[JVM虚拟机] ...
- 【JVM虚拟机】(7)---深入理解Class中-属性集合
#[JVM虚拟机](7)---深入理解Class中-属性集合 之前有关class文件已经写了两篇博客: 1.[JVM虚拟机](5)---深入理解JVM-Class中常量池 2.[JVM虚拟机](6)- ...
- 【JVM虚拟机】(6)---深入理解Class中访问标志、类索引、父类索引、接口索引
JVM(6)访问标志,类索引 上一篇博客讲[JVM虚拟机](5)---深入理解JVM-Class中常量池 我们知道一个class文件正常可以分为7个部分: 魔数与class文件版本 常量池 访问标志 ...
- 【JVM虚拟机】(5)---深入理解JVM-Class中常量池
深入理解Class---常量池 一.概念 1.jvm生命周期 启动:当启动一个java程序时,一个jvm实例就诞生了,任何一个拥有main方法的class都可以作为jvm实例运行的起点. 运行:mai ...
随机推荐
- 复习Java虚拟机:JVM中的Stack和Heap
在JVM中,内存分为两个部分,Stack(栈)和Heap(堆).这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JVM的 ...
- substr扩展版:支持中文字符串截取
function d_substr($str, $start=0, $length, $charset="utf-8", $suffix=true) { if(function_e ...
- JAVA中int与String类型的相互转换
Java的int和String类型间互相转换,小功能但是经常用到,下面是几种实现的方法: 字符串类型String转换成整数int 1. int i = Integer.parseInt([String ...
- 【题解】Fence(单调队列)
[题解]Fence(单调队列) POJ - 1821 题目大意 有\(k\)个粉刷匠,每个粉刷匠一定要粉刷某个位置\(S_i\),一个粉刷匠可以粉刷至多\(l_i\)个位置(必须连续\(l_i\)互不 ...
- CUDA: 原子操作
1.1以上计算功能集支持全局内存上的原子操作, 1.2以上支持共享内存上的原子操作. atomicAdd(add,y)将生成一个原子的操作序列,这个操作序列包括读取地址addr处的值,将y增加到这个值 ...
- yum 安装软件时出现 is this ok [y/d/n]
y下载安装 d只下载不安装 n不安装
- SDUT OJ I样(0-1背包问题 【模板】)
I样 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 这是个什么问题呢?DP,贪心,数据结构,图论,数论还是计算几何?管他呢,反正 ...
- 7.8 LZW压缩的实现
7-10 lzw.c #include <stdlib.h> #include <stdio.h> #define BITS 12 //每个数据项的二进制位数 #define ...
- TYOI 1015 Game:博弈 结论【步数之和的奇偶性】
题意: 明明和亮亮在玩一个游戏. 桌面上一行有n个格子,一些格子中放着棋子. 明明和亮亮轮流选择如下方式中的一种移动棋子(图示中o表示棋子,*表示空着的格子): (1)当一枚棋子的右边是空格子的话,可 ...
- javascript(7)
js中基于对象==js面向对象 js中没有类class,但是它 JavaScript是一种面向(基于)对象的动态脚本语言,是一种基于对象和事件驱动并具有安全性能的脚本语言.它具有面向对象语言所特有的各 ...