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中調用。