有這個必要嗎?都過期的東西了,android上的Dalvik效率不夠高嗎,不夠逼格嗎?java
是的但有總東西是否是咱們這些碼農能決定的,領導和項目需求才是你要關心的,畢竟工做要向領導彙報,項目要去掙錢錢,但掙了money你也只有工資,就這麼現實。linux
言歸正傳,發發牢騷能夠,可是幹活還得繼續。android
咱們確定不去造輪子,那樣太累。仍是藉助開源來完成咱們的功能,通過google找到了一個好的的開源jvm, PhoneMe sun開源的java虛擬機。程序員
PhoneME簡介編程
phoneME Feature software是一個優化了的Java ME架構。它的核心是支持多任務的MIDP2.1規範實現。當phoneME Feature software運行多個MIDlet時,它只使用一個系統進程,由於一個Java虛擬機實例能夠執行幾個應用,並提供獨立的運行時空間。全部運行的應用都是獨立的,看起來好象每一個應用都在本身的虛擬機中執行同樣。bash
n Java Binding for the OpenGL ES API (JSR 239)微信
這個是Feature版本這是未設備資源較少的設備優化的,可是咱們是在android下,它是智能設備了因此咱們選擇advanced版本這個版本支持智能設備。下面咱們就一步一步來把它移植到android上。網絡
1、源碼版本下載架構
#!/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
這個是最後更新的版本,及爲最新版本,不過是四年前更新的。併發
2、結構說明
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架構。
2、編譯配置
#!/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),一個開發人員的家,來訴說本身的故事。