1.C++中如果要使用STL的东西,如string.queue等等,需要在Application.mk文件中添加
- APP_CFLAGS += -fexceptions
- APP_STL := gnustl_static
另外, 由于我的应用程序还需要用到 libiconv.a这个库, 但是android并没有这方面的支持, 所以我下载了libiconv的源码来通过NDK编译。
编译libiconv的 Android.mk文件内容如下:
- LOCAL_PATH:= $(call my-dir)
- # first lib, which will be built statically
- include $(CLEAR_VARS)
- LOCAL_MODULE := iconv
- LOCAL_SRC_FILES := libcharset/lib/localcharset.c lib/iconv.c lib/relocatable.c
- LOCAL_C_INCLUDES := include lib libcharset/include
- LOCAL_CFLAGS := -Wno-multichar -D_ANDROID -DLIBDIR="c" -DBUILDING_LIBICONV -DIN_LIBRARY
- #LOCAL_PRELINK_MODULE := false
- include $(BUILD_STATIC_LIBRARY)
编译libiconv的Application.mk文件内容如下:
- APP_MODULES := libiconv
android本身支持的c++无异常处理、RTTI,c++标准库等。
不过有人定制了一个NDK,全支持这些了。
为什么会出现如:error: undefined reference to '__cxa_end_cleanup' 的链接错误。Android上用stlport时。因为没有链接到libstdc++.a。所以出错。
因为用到了一些静态库, 所以必须要链接完整的libstdc++.a。可以在
http://crystax.net/android/ndk.php这里下载的包里
sources\cxx-stl\gnu-libstdc++\libs\armeabi目录中找到。
Android上本身的libstdc++支持有限,所以必须链接到一个完整的libstdc++.a才行。
在Android.mk文件中加入
LOCAL_LDFLAGS = $(LOCAL_PATH)/libs/libcurl.a \
$(LOCAL_PATH)/libs/libstdc++.a
以及LOCAL_CPPFLAGS += -lstdc++ -fexceptions就可以编译通过了。
2. .c文件不可以包含stl有关的头文件,例如queue,string。所以一些公用的头文件,要区分是在.c中调用还是z在.cpp中调用。