有没有人有使用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