2010-01-23 53 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} }; 
相关问题