找回密碼
 註冊
搜索
查看: 1755|回復: 1

[教學] 基本Dalvik VM調用

[複製鏈接]
發表於 2013-11-8 18:52:09 | 顯示全部樓層 |閱讀模式
 
Push to Facebook
中文原文: 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到設備。這兒是個簡單的例子:



  1. % echo 'class Foo {'\
  2. > 'public static void main(String[] args) {'\
  3. > 'System.out.println("Hello, world"); }}'
  4. > Foo.java
  5. % javac Foo.java
  6. % dx --dex --output=foo.jar Foo.class
  7. % adb push foo.jar /sdcard
  8. % adb shell dalvikvm -cp /sdcard/foo.jar Foo
  9. 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
    你可以看到


  1. ============================================
  2. TARGET_PRODUCT=sim
  3. TARGET_BUILD_VARIANT=eng
  4. TARGET_SIMULATOR=true
  5. TARGET_BUILD_TYPE=debug
  6. TARGET_ARCH=x86
  7. HOST_ARCH=x86
  8. HOST_OS=linux
  9. HOST_BUILD_TYPE=release
  10. BUILD_ID=
  11. ============================================
複製代碼



這引導你為桌面vm進行編譯,編譯是基於glibc的。該模式僅僅為實驗用,或許將來會更有用。
你可能看到TARGET_BUILD_TYPE=debug或者 = release或者什麼都沒有,你只要改變lunch命令的參數就可以。
其次,編譯:
make
當完成後,在桌面運行dalvik:


  1. % dalvikvm
  2. E/dalvikvm(19521): ERROR: must specify non-'.' bootclasspath
  3. W/dalvikvm(19521): JNI_CreateJavaVM failed
  4. Dalvik VM init failed (check log file)
複製代碼




為了運行,你必須指定指定引導程序的路徑,指定放解壓jar文件後dex數據的空間。可以這樣做:


  1. #!/bin/sh
  2. # base directory, at top of source tree; replace with absolute path
  3. base=`pwd`
  4. # configure root dir of interesting stuff
  5. root=$base/out/debug/host/linux-x86/product/sim/system
  6. export ANDROID_ROOT=$root
  7. # configure bootclasspath
  8. bootpath=$root/frameworkexport BOOTCLASSPATH=$bootpath/core.jar:$bootpath/ext.jar:$bootpath/framework.jar:$bootpath/android.policy.jar:$bootpath/services.jar
  9. # this is where we create the dalvik-cache directory; make sure it exists
  10. export ANDROID_DATA=/tmp/dalvik_$USER
  11. mkdir -p $ANDROID_DATA/dalvik-cache
  12. exec dalvikvm $@
複製代碼




準備dx的方式和前面一行:


  1. % cat > Foo.java
  2. class Foo {
  3. public static void main(String[] args) {
  4.     System.out.println("Hello, world");
  5. }
  6. }
  7. (ctrl-D)
  8. % javac Foo.java
  9. % dx --dex --output=foo.jar Foo.class
  10. % ./rund -cp foo.jar Foo
  11. Hello, world
複製代碼



你可以獲得參數的幫助通過以下的命令:

  1. % ./rund -help
複製代碼

這也可以顯示vm可用選項參數。模擬「調試」環境有完整的additional assertion,使能檢測功能(導致了vm變慢),但是也因此能測試。

上述所有都是基於x86的,其他的架構還要考慮porting工作,如果libffi支持你的系統,工作量會比較小。

 
發表於 2013-11-8 21:28:23 | 顯示全部樓層
{:5_4:}牛X海海!!!
版主招募中
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

Archiver|手機版|小黑屋|TShopping

GMT+8, 2025-5-1 15:08 , Processed in 0.033660 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回復 返回頂部 返回列表