很多时候,我们需要将其他平台已经成型的java应用直接空降到android平台之上,管他是X86(PC)还是SUN的,我们不想费那劲改一大堆代码,但是偏偏这些Java应用用到了很多native的库还有一大堆android为了省事没有支持的服务, how can we do?
首先我们明确,所有的应用无论多眩,到最后都是JVM(对android来说,是dalvik)上的一堆烂代码class.dex--参看我以前的博文,另外,为了达到变成烂代码的目的,我们需要做一个android apK的框框,这个下个eclipse,再来个android sdk谁都有。另外还需要什么呢?为了应用畅行无阻,我们还需要个合适的签名文件。 O了。
天幸Java和androidSDK 提供了所有必须的工具。
一,进入所有引用到的库或者服务,用ARM交叉编译和ant狠狠折磨他,目的是变成android可认的JAR包。(说起来容易,做起来难)
以JNA为例--目前android Java与native code的接口只支持JNI,不支持只在Java操作的JNA。这是android源自我Linux山门的一个有力证据。
#Jna
cd $JNA_PATH
ant -Djre.arch=arm -Dos.arch=arm -Dos.prefix=linux-armv7l
cp build/jna.jar $JAR_PATH
#cp build/native/libjnidispatch.so $LIB_PATH/armeabi/
二,同理'ant"你的主程序。
#Java control
ant
cp $CALLCONTROL_PATH/build/dist/XXX.jar $JAR_PATH/.
cp $H323STACK_PATH/build/dist/XXXX.jar $JAR_PATH/.
cp $CALLCONTROL_PATH/build/dist/lib/android/libXXXX_android.a $LIB_PATH/armeabi/
三,android框框
#android skeleton
javac -encoding GB18030 -bootclasspath $ANDROID_FILES -cp $JAR_PATH/XXX.jar:$JAR_PATH/XXXX.jar -d $BIN_PATH $ANDROID
四,把所有的大杂烩融到一起。生成class.dex.
#get class.dex
dx --dex --output=class.dex $BIN_PATH $JAR_PATH/
五,加上android apk必须的resource.
# get resource
aapt package -M $BUILD_PATH/AndroidManifest.xml -A $BUILD_PATH/assets/ -S $BUILD_PATH/res/ -I $ANDROID_FILES -f -F byreader
六, 来吧,生成个原始的apk.
# get a raw apk
apkbuilder control.apk -u -z byreader -f class.dex -nf $LIB_PATH -rj $JAR_PATH/jna.jar
七, 别忘了加上通行证--签名。
#sign. get the last apk
java -jar $SIGN_FILES control.apk control-app.apk
其中的SIGN_FILES 就是signapk.jar platform.x509.pem platform.pk8。
大功告成。《《《《---亲个嘴儿--》》》
特此声明:上述步骤只做参考,帮助理解,如直接拷贝用做项目,一切后果概不负责。