Android NDK 編譯C、C++混合程序小結(1)

1.C++中如果要使用STL的東西,如string.queue等等,需要在Application.mk文件中添加

[plain] view plaincop
  1. APP_CFLAGS += -fexceptions  
  2. APP_STL := gnustl_static  

另外, 由於我的應用程序還需要用到 libiconv.a這個庫, 但是android並沒有這方面的支持, 所以我下載了libiconv的源碼來通過NDK編譯。

編譯libiconv的 Android.mk文件內容如下:

[html] view plaincopy
  1. LOCAL_PATH:= $(call my-dir)  
  2.   
  3. # first lib, which will be built statically  
  4.   
  5. include $(CLEAR_VARS)  
  6.   
  7. LOCAL_MODULE :iconv  
  8. LOCAL_SRC_FILES :libcharset/lib/localcharset.c lib/iconv.c lib/relocatable.c  
  9.   
  10. LOCAL_C_INCLUDES :include lib libcharset/include  
  11.   
  12. LOCAL_CFLAGS := -Wno-multichar -D_ANDROID -DLIBDIR="c" -DBUILDING_LIBICONV -DIN_LIBRARY  
  13. #LOCAL_PRELINK_MODULE :false  
  14. include $(BUILD_STATIC_LIBRARY)  

編譯libiconv的Application.mk文件內容如下:

[plain] view plaincopy
  1. APP_MODULES := libiconv  
關於Android對C++的支持: 
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中調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章