有沒有人有使用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. SignalR是否可以在手機上工作
- 2. Google App Inventor是否可以在AT&T手機上工作?
- 3. 是否可以在Android平板電腦上模擬Android手機?
- 4. 是否可以在Android手機上創建手機應答機程序?
- 5. 是否可以在Android手機上安裝java fx?
- 6. 是否可以在手機上訪問Android應用的SQLite數據庫?
- 7. 是否可以在Android手機上完成所有這些操作?
- 8. NSUndoManager是否可以在iPhone上無抖動手勢地工作?
- 9. 是否可以阻止Android手機上的傳出短信?
- 10. 是否可以檢測Android手機是否有軌跡球?
- 11. jQuery是否可以在PSP上工作
- 12. 是否可以在Android手機中執行shell腳本?
- 13. 是否可以在Android手機中整合不同的google apis?
- 14. 可以AlarmManager(alarm.setRepeating)在手機重啓的情況下工作 - Android
- 15. Miracast是否可以在平板電腦上使用手機?
- 16. 這個工作是否會在手機上出現問題?
- 17. 檢查耳機是否在Android手機
- 18. 是否可以創建SIM卡圖像並在Android手機上使用它?
- 19. 是否可以直接在HTC Evo手機上創建Android應用程序?
- 20. Android FileWriter不能在索尼愛立信弧上工作,但可以在另一部手機上工作
- 21. HTTPS服務器不能在Android手機上工作,但HTTP可以嗎?
- 22. 是否可以在其他手機上安裝Android?像SH004或其他OEM手機
- 23. 當手機睡着時,是否可以在android手機屏幕上顯示一些最小文本?
- 24. Android「沒有應用程序可以通過URL執行此操作」,但可以在手機上正常工作
- 25. 是否可以通過手機瀏覽器觸發Android服務?
- 26. 檢查Android手機是否可以訪問互聯網
- 27. 是否可以檢測iPhone的/ Android的手機語言?
- 28. 是否可以更改Android手機中的imei號碼
- 29. 是否可以使用Android SDK或NDK重新啓動手機?
- 30. 在手機關機之前是否可以發送HttpRequest?
謝謝您的回答丹尼爾。我也剛剛讀到,原生Dalvik核心代碼是用C/C++編寫的,並且還使用了JNI橋。這與我想做的工作類似,因此我希望我可以在Android應用程序中將JNI調用寫入C庫。 – Trossachs 2010-01-23 18:16:29