关于Android NDK如何成功调用stl的使用分析

来源:互联网 发布:webrtc 最新源码下载 编辑:程序博客网 时间:2024/04/28 12:47

今天终于在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的支持差异非常的大,切勿随便混淆,不然你的程序表面编译成功了,暗地了却会给你带来无穷的困扰!!!

 

 

 

 

原创粉丝点击