有沒有人有使用JNI在Android中調用本地C/C++庫的經驗?該環境是否適合運行C/C++庫,如果是,是否有關於您需要適應的環境的具體內容? 謝謝C/C++庫是否可以在Android手機上工作
回答
我的理解是,Android只提供標準C++運行時庫的一個子集。例如,Android does not support exceptions採用本機代碼。我認爲還有其他限制。
一個複雜之處在於,而Android本身可能包括許多本地庫,只有一些被認爲不夠穩定來鏈接。 Android NDK page列出了安全的庫。
- 的libc(C庫)報頭
- 的libm(數學庫)報頭
- JNI接口頭
- libz進行(zlib壓縮)報頭
- liblog(Android的記錄)頭
- 最小支持C++的頭文件集
如果您的C庫僅使用這些頭文件,那麼您應該沒事。 C++支持聽起來有點像spottier。
對於C庫,你不應該有任何麻煩。如果使用大部分標準庫,C++庫可能會更有趣,因爲大部分C++標準庫都缺失,但您始終可以提供自己的「mini-STL」。這基本上是外部/ webkit的工作原理。
很多Android的java.util.regex中,java.nio.charset中,java.util中和java.text中都是通過調用ICU4C,例如實施。 (該庫位於external/icu4c中,JNI位於dalvik/libcore/icu/src/main/native中),使用了ICU的C和C++接口組合,因此您可以放心,這些東西在每天;-)
對於C和Java集成的一個很好的例子,看看這個:
https://github.com/jackpal/Android-Terminal-Emulator
解壓文件,你可以找到一個JNI/termExec.cpp - 它使用普通的C API(如「exec()」,「fork()」和「open(/ dev/ptmx)」來實現終端仿真(http://linux.die.net/man/4/ptmx)。
查找jni/Android.mk文件,並且可以看到cpp編譯爲庫 - libandroidterm。
然後Java應用程序中(src/jackpal/androidterm/Exec.java)將通過的System.loadLibrary( 「androidterm」)加載庫。
我認爲這個應用程序提供了一個足夠小的例子來擴展你喜歡的任何方式 - 無論是cpp還是java文件。 (cpp文件基本上是基於C的,而不是C + plus)。
記住它們之間的映射,例如這裏是:
static JNINativeMethod method_table[]
= {
{ "createSubprocess", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[I)Ljava/io/FileDescriptor;",
(void*) android_os_Exec_createSubProcess },
{ "setPtyWindowSize", "(Ljava/io/FileDescriptor;IIII)V",
(void*) android_os_Exec_setPtyWindowSize},
{ "waitFor", "(I)I",
(void*) android_os_Exec_waitFor},
{ "close", "(Ljava/io/FileDescriptor;)V",
(void*) android_os_Exec_close} };
- 1. Google App Inventor是否可以在AT&T手機上工作?
- 2. 是否可以在Android手機上創建手機應答機程序?
- 3. 是否可以在手機上訪問Android應用的SQLite數據庫?
- 4. 是否可以在Android手機上完成所有這些操作?
- 5. NSUndoManager是否可以在iPhone上無抖動手勢地工作?
- 6. 是否可以阻止Android手機上的傳出短信?
- 7. 是否可以檢測Android手機是否有軌跡球?
- 8. jQuery是否可以在PSP上工作
- 9. 可以AlarmManager(alarm.setRepeating)在手機重啓的情況下工作 - Android
- 10. 檢查耳機是否在Android手機
- 11. HTTPS服務器不能在Android手機上工作,但HTTP可以嗎?
- 12. 是否可以直接在HTC Evo手機上創建Android應用程序?
- 13. Android「沒有應用程序可以通過URL執行此操作」,但可以在手機上正常工作
- 14. 是否可以在其他手機上安裝Android?像SH004或其他OEM手機
- 15. 是否可以更改Android手機中的imei號碼
- 16. 是否可以使用Android SDK或NDK重新啓動手機?
- 17. Android代碼在手機上工作,但不在仿真器上
- 18. Android測試 - 應用程序在一部手機上工作,但在其他手機上工作
- 19. 在手機關機之前是否可以發送HttpRequest?
- 20. 機器視覺API是否可以脫機工作?
- 21. 我是否需要讓我的android手機上的.apk文件繼續工作?
- 22. 是否可以通過智能手機瀏覽器製作livecam?
- 23. 是否可以爲手機編寫操作系統?
- 24. Android Market應用是否已安裝在每部Android手機上
- 25. Windows Phone - 是否可以更改手機上的主題顏色?
- 26. 是否可以隱藏植根Android手機上的「USB調試」切換?
- 27. 在手機上的Android數據庫
- 28. Android應用程序在模擬器上工作,但不是在手機上
- 29. 可以在植根Android手機
- 30. PHP是否可以在TML中工作?
謝謝您的回答丹尼爾。我也剛剛讀到,原生Dalvik核心代碼是用C/C++編寫的,並且還使用了JNI橋。這與我想做的工作類似,因此我希望我可以在Android應用程序中將JNI調用寫入C庫。 – Trossachs 2010-01-23 18:16:29