2010-01-23 57 views

回答

2

我的理解是,Android只提供標準C++運行時庫的一個子集。例如,Android does not support exceptions採用本機代碼。我認爲還有其他限制。


一個複雜之處在於,而Android本身可能包括許多本地庫,只有一些被認爲不夠穩定來鏈接。 Android NDK page列出了安全的庫。

  • 的libc(C庫)報頭
  • 的libm(數學庫)報頭
  • JNI接口頭
  • libz進行(zlib壓縮)報頭
  • liblog(Android的記錄)頭
  • 最小支持C++的頭文件集

如果您的C庫僅使用這些頭文件,那麼您應該沒事。 C++支持聽起來有點像spottier。

+0

謝謝您的回答丹尼爾。我也剛剛讀到,原生Dalvik核心代碼是用C/C++編寫的,並且還使用了JNI橋。這與我想做的工作類似,因此我希望我可以在Android應用程序中將JNI調用寫入C庫。 – Trossachs 2010-01-23 18:16:29

0

對於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++接口組合,因此您可以放心,這些東西在每天;-)

1

對於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} }; 
相關問題