關於Android NDK如何成功調用stl的使用分析

今天終於在Android上成功調用了基於RTSP的網絡庫接口,經過N長時間的糾結,終於完成了!

我的Android NDK版本是NDK r5b,系統是ubuntu10.04

首先,Android中的C++引用stl庫

1 在需要調用模板庫的文件前包含頭文件:
 
#include <iostream>
 
  #include <vector>
 
此時編譯可能不過,需要在Android.mk文件內添加:
 
LOCAL_C_INCLUDES :=   /home/administrator/android-ndk-r5b/sources/cxx-stl/stlport/stlport     (ndk安裝路徑下的stl庫)
 
2  在 Android.mk 文件前加入:
 
APP_STL  :=  stlprot_shared    //模板庫以動態庫的方式加載
 
  LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib  -llog \

LOCAL_SHARED_LIBRARY:=  /NetSdklib/libstlprot_shared.so

在application.mk中

# The ARMv7 is significanly faster due to the use of the hardware FPU
APP_ABI := armeabi
APP_PLATFORM := android-10

簡單的這麼寫編譯是可以成功的,但是在鏈接加載庫的時候,就會出現詭異的錯誤,庫生成成功了,卻調用失敗

用arm-none-linux-gnueabi-ld工具分析這個動態庫,會發現跟stl相關的函數定義出現錯誤...

在網上查找各種資料,最後發現一篇文章講到了這些:

Android開發者都喜歡用C++編寫一些高效的應用,或者是某種開發需要必須要用到C/C++的代碼,有關Android NDK的C++開發相關總結如下:

  1. 從Android NDK r5開始支持了STL Port,在這個版本開始就可以使用部分STL庫的功能了,比如說vector、map,string擺脫c下面容易出現的數組未初始化、越界,增強應用的健壯性。不包含相關的頭文件就會報編譯錯誤!

  2. 很多網友包含了include <vector> 這樣頭,但仍然無法編譯,這裏你首先要檢查當前文件是否爲.cpp後綴,同時爲了使用標準庫必須加入 APP_STL := stlport_static 在Application.mk文件中。相關對應還有

system              使用默認最小的C++運行庫,這樣生成的應用體積小,內存佔用小,但部分功能將無法支持
stlport_static      使用STLport作爲靜態庫,這項是Android開發網極力推薦的
stlport_shared     STLport 作爲動態庫,這個可能產生兼容性和部分低版本的Android固件,目前不推薦使用。
gnustl_static      使用 GNU libstdc++ 作爲靜態庫

 3 默認情況下STLPORT是不支持C++異常處理和RTTI,所以不要出現 -fexceptions 或 -frtti ,如果真的需要可以使用gnustl_static來支持標準C++的特性,但生成的文件體積會偏大,運行效率會低一些。 支持C++異常處理,在Application.mk中加入 LOCAL_CPPFLAGS += -fexceptions這句,同理支持RTTI,則加入LOCAL_CPPFLAGS += -frtti,這裏Android123再次提醒大家,第二條說的使用gnustl靜態庫,而不是stlport

  4. 強制重新編譯 STLPort ,在Application.mk中加入 STLPORT_FORCE_REBUILD := true 可以強制重新編譯STLPort源碼,由於一些原因可能自己需要修改下STLPort庫,一般普通的開發者無需使用此項。

 5 Android目前目前已有更新的NDK版本,相關的學習可以查看NDK中的Samples整體和在PC上開發沒有太大的不同。

 6.強烈建議做Android NDK開發的童鞋們根據自己的NDK版本,書寫application.mk的支持平臺,因爲你引用的stl庫的版本是基於你這個NDK版本的,如果你支持的平臺下

對stl的兼容存在問題,生成的庫文件就可能報加載不成功的錯誤,而且強烈建議不要使用stl的動態庫

 7.NDK r5b對gnustl和stlport的支持差異非常的大,切勿隨便混淆,不然你的程序表面編譯成功了,暗地了卻會給你帶來無窮的困擾!!!

 

 

 

 

發佈了49 篇原創文章 · 獲贊 5 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章