在Android(安卓)JNI环境下使用C++的几个问题与解决
16lz
2021-01-26
序言
在测试tinythread++库在不同移动平台下的可用性时,碰到几个问题。tinythread++号称是兼容c++11标准的thread库,当不能使用c++11时可以使用之。未来c++11更为流行时可轻易更换。
不同平台下的测试状况:
- iOS: 通过。需要将调用c++代码的.m文件更名为.mm文件。
- WP: 未知。暂未涉及。
- Android: 通过。在解决了下面的几个问题之后。
Android JNI环境下的C++问题:
1)error: base operand of '->' has non-pointer type '_JNIEnv'
C++的调用方式与C有所不同,比较:C++: env->NewStringUTF("JNI C++!"); C: (*env)->NewStringUTF(env, "JNI C!");举例:
jstringJava_com_listthrd_MainActivity_runListThrd( JNIEnv* env, jobject thiz ){ // for C++ return env->NewStringUTF("JNI C++!"); // for C// return (*env)->NewStringUTF(env, "JNI C!");}
2) error: iostream: No such file or directory
找不到iostream等stl库文件,这是由于ndk默认不使用stl。解决:在jni目录创建Application.mk文件,加入一下内容:
#APP_STL:=stlport_staticAPP_STL := gnustl_static以上,二选一即可。推荐gnustl,因为可以解决其它问题,见后。
3) error: 'terminate' is not a member of 'std'
当使用stlport时会产生这个错误。改用gnustl_static即可。4) undefined reference to `__cxa_end_cleanup'
当使用stlport时会产生这个错误。因此改用gnustl_static。5) undefined reference to `__android_log_print'
这是未链接上Android的log库。在Android.mk文件中添加LOCAL_LDLIBS定义,如下:#LOCAL_EXPORT_LDLIBS := -llogLOCAL_LDLIBS := -llog以上,LOCAL_EXPORT_LDLIBS在C语言时好用,此处可去掉。
6) ERROR/AndroidRuntime(330): FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError ...
需使用C语言风格的调用约定,在导出的JNI函数前添加extern "C"指定,或用花括弧括起JNI导出函数。例如:
extern "C" { JNIEXPORT jstring JNICALL Java_com_listthrd_MainActivity_runListThrd( JNIEnv* env, jobject thiz ) { // ... }}
【附】
1、TinyThread++: http://tinythreadpp.bitsnbites.eu/更多相关文章
- Qt for Android(安卓)自定义启动页(解决启动页拉伸的问题)
- Android(安卓)生成正式签名的APK文件
- Unity3d Android(安卓)SDK接入解析(四)通用的Android(安卓)SDK接入
- MTK androiod5.1源码精简系统APP
- Android(安卓)API Guides---Audio Capture
- android 打包自己的自定义组件成JAR包
- (原)Android到IOS开发的转换(一)
- [Android(安卓)Studio系列(三)]Android(安卓)Studio 编译、同步
- Android(安卓)使用百度离线地图(由apk文件转入手机内部存储)