|
中文原文: http://hi.baidu.com/seucrcr/item/ebd1b34879a168086cc2f078
英文原文:http://www.netmite.com/android/mydroid/2.0/dalvik/docs/hello-world.html
在android設備上,dalvik vm通常都被嵌入到android應用框架裡執行,也可以直接運行vm,就像你要在你桌面系統運行虛擬機一樣。
但是很多Android的JNI無法調用。因為Android的很多JNI其實是需要手動註冊的。要想完美的解決該問題,請在shell控制台直接通過運行app_process程序啟動一個JAVA程序。關於此的更多內容請參考《如何在Android中啟動JAVA程序》
在編譯完java源碼後,轉換並整合.class文件到.dex文件然後將它push到設備。這兒是個簡單的例子:
- % echo 'class Foo {'\
- > 'public static void main(String[] args) {'\
- > 'System.out.println("Hello, world"); }}'
- > Foo.java
- % javac Foo.java
- % dx --dex --output=foo.jar Foo.class
- % adb push foo.jar /sdcard
- % adb shell dalvikvm -cp /sdcard/foo.jar Foo
- Hello, world
複製代碼
-cp選項設置了路徑。adb shel的初始路徑可能並不是你要的,最好指定絕對路徑。
dx命令接收了每個class的文件、目錄或者jar結構列表,當--output文件名以.jar、.zip或者.apk結尾時,一個叫做classes.dex的文件就被創建並保存。
運行adb shell davlikvm -help可獲得更多命令行選項。
1、使用調試器
你可以通過服從jdwp的調試器來調試獨立的應用,有兩種基本方法。
一種是通過TCP,一種是通過DDMS。(CR:唔,前面看過了)
2、桌面編譯
dalvik vm也可以直接在桌面使用,事實上這更複雜,因為你沒有建立環境的一些東西,本地庫代碼被用於支持核心dalvik庫。
首先:
. build/envsetup.sh
lunch sim-eng
你可以看到
- ============================================
- TARGET_PRODUCT=sim
- TARGET_BUILD_VARIANT=eng
- TARGET_SIMULATOR=true
- TARGET_BUILD_TYPE=debug
- TARGET_ARCH=x86
- HOST_ARCH=x86
- HOST_OS=linux
- HOST_BUILD_TYPE=release
- BUILD_ID=
- ============================================
複製代碼
這引導你為桌面vm進行編譯,編譯是基於glibc的。該模式僅僅為實驗用,或許將來會更有用。
你可能看到TARGET_BUILD_TYPE=debug或者 = release或者什麼都沒有,你只要改變lunch命令的參數就可以。
其次,編譯:
make
當完成後,在桌面運行dalvik:
- % dalvikvm
- E/dalvikvm(19521): ERROR: must specify non-'.' bootclasspath
- W/dalvikvm(19521): JNI_CreateJavaVM failed
- Dalvik VM init failed (check log file)
複製代碼
為了運行,你必須指定指定引導程序的路徑,指定放解壓jar文件後dex數據的空間。可以這樣做:
- #!/bin/sh
- # base directory, at top of source tree; replace with absolute path
- base=`pwd`
- # configure root dir of interesting stuff
- root=$base/out/debug/host/linux-x86/product/sim/system
- export ANDROID_ROOT=$root
- # configure bootclasspath
- bootpath=$root/frameworkexport BOOTCLASSPATH=$bootpath/core.jar:$bootpath/ext.jar:$bootpath/framework.jar:$bootpath/android.policy.jar:$bootpath/services.jar
- # this is where we create the dalvik-cache directory; make sure it exists
- export ANDROID_DATA=/tmp/dalvik_$USER
- mkdir -p $ANDROID_DATA/dalvik-cache
- exec dalvikvm $@
複製代碼
準備dx的方式和前面一行:
- % cat > Foo.java
- class Foo {
- public static void main(String[] args) {
- System.out.println("Hello, world");
- }
- }
- (ctrl-D)
- % javac Foo.java
- % dx --dex --output=foo.jar Foo.class
- % ./rund -cp foo.jar Foo
- Hello, world
複製代碼
你可以獲得參數的幫助通過以下的命令:
這也可以顯示vm可用選項參數。模擬「調試」環境有完整的additional assertion,使能檢測功能(導致了vm變慢),但是也因此能測試。
上述所有都是基於x86的,其他的架構還要考慮porting工作,如果libffi支持你的系統,工作量會比較小。
|
|