在NDK中使用shared_ptr

NDK版本:r10c

Application.mk文件内容如下:

APP_STL := gnustl_shared
NDK_TOOLCHAIN_VERSION := 4.8
APP_CPPFLAGS += -std=c++0x
APP_CPPFLAGS += -fexceptions
APP_CPPFLAGS += -frtti

解释:

我使用的是C++0x中的std::shared_ptr。所以,GCC版本必须要支持C++0x。

NDK_TOOLCHAIN_VERSION:=4.8就指定了GCC的版本为4.8。

关键要指定STL的版本为gnustl_shared,而不能是stlport_shared。

在gnustl版本中,shared_ptr定义在NDK根目录\sources\cxx-stl\gnu-libstdc++\4.8\include\memory文件中,具体内容如下:

#if __cplusplus >= 201103L
#  include <exception>        	  // std::exception
#  include <typeinfo>         	  // std::type_info in get_deleter
#  include <iosfwd>           	  // std::basic_ostream
#  include <ext/atomicity.h>
#  include <ext/concurrence.h>
#  include <bits/functexcept.h>
#  include <bits/stl_function.h>  // std::less
#  include <bits/uses_allocator.h>
#  include <type_traits>
#  include <functional>
#  include <debug/debug.h>
#  include <bits/unique_ptr.h>
#  include <bits/shared_ptr.h>
#  if _GLIBCXX_USE_DEPRECATED
#    include <backward/auto_ptr.h>
#  endif
#else
#  include <backward/auto_ptr.h>
#endif

只要GCC的版本够高,__cplusplus就会大于201103L。就可以使用shared_ptr了。

而stlport使用boost库,支持shared_ptr。

在stlport版本中,shared_ptr定义在NDK根目录\sources\cxx-stl\stlport\stlport\memory文件中,具体内容如下:

#if !defined(_STLP_NO_EXTENSIONS) && defined(_STLP_USE_BOOST_SUPPORT)

namespace boost {

class bad_weak_ptr;
template<class T> class shared_ptr;
template<class T> class weak_ptr;
template<class T> class enable_shared_from_this;
template<class D, class T> D * get_deleter(shared_ptr<T> const & p);

我不想使用Boost,就没有深入研究如何使用stlport的shared_ptr。

顺便说一下,如果你的程序由多个so构成,如果使用c++开发,一定要链接动态运行库。具体原因见NDK官方文档。

时间: 2024-10-13 19:43:49

在NDK中使用shared_ptr的相关文章

ndk学习5: ndk中使用c++

默认情况下ndk不支持标准C++库,异常, rtti等 ? 在ndk文档有关于C++ support的详细介绍 ? 一. 使用C++标准库 介绍: 默认是使用最小额度的C++运行时库, 在Application.mk中添加APP_STL指明所需要的库 需要注意的是,目标手机或者模拟器上可能没有下面的共享库,此时就需要你作为静态库使用 ndk中各种库的支持情况 ? PS: stlport和gnustl的区别 ? ??Android NDK不提供STL的原因应该是因为版权问题.因为标准的GNU ST

请问大家ndk中LOCAL_SHARED_LIBRARIES LOCAL_LDLIBS什么区别

请问大家ndk中LOCAL_SHARED_LIBRARIES LOCAL_LDLIBS什么区别啊 我先是编译了一个.so 然后在此次编译的使用调用,请问用LOCAL_SHARED_LIBRARIES和LOCAL_LDLIBS什么区别啊,我用后者能编译通过,用前者不行呢,谢谢!! 1.共享库放在其他程序里面也应该可以调用   非共享库只能在本程序调用      我想是这样的  不知道对不对 2.我用LOCAL_LDLIBS,编译的时候,提示:ndroideabi/bin/ld.exe: canno

Android NDK中的C++调试踩坑标记

RT, Android NDK中的C++调试, GDB调试比较麻烦,在ADT Eclipse中: 1.配置好NDK给工程加上Native Support 2.编译中加上NDK_DEBUG=1 3.然后改造下mk文件: #APP_DEBUG will be set by android-ndk if NDK_DEBUG=1 is set. ifdef APP_DEBUG ifeq ($(APP_DEBUG),true) CFLAGS+= -O0 -g LOCAL_CFLAGS+= -D_DEBUG

NDK使用技巧、多线程调用注意、ndk中的工具使用

//NDK 使用技巧和多线程调用注意 //http://www.ibm.com/search/csass/search/?q=ndk&sn=dw&lang=zh&cc=CN&en=utf&hpp=20&dws=cndw&lo=zh void demo(JNIEnv* env, jobject thiz) { //这JNI接口指针可以存储,但只在当前线程仍然是有效的. /* A JNI environment pointer (JNIEnv*) is

Android技术13:NDK中无法返回中文问题解决

1问题 为了加强软件的安全性,将http请求,封装在jni中,即通过c语言实现http请求,返回字符串.然而字符串往往包含中文,当返回类型为jstring时,就会出现JNI WARNING: illegal continuation byte 0xd0这错误,这是因为jni中c文件有中文, 中文不能被识别.无法使用(*env)->NewStringUTF(env,s);返回字符串. 2.方案 2.1将native方法返回类型为byte数组  例如:private native byte[] ge

Android NDK中的Apache ANT和GUN Make

Android NDK是Android软件开发包SDK的相关工具集,用来扩展Android SDK的功能,从而使开发人员能够使用机器代码生成的编程语言(如C.c++和汇编语言)实现一些对代码性能要求较高的模块并将这些模块嵌入到Android应用程序中. Apache ANT是命令行构建工具,可以驱动任何根据目标和任务描述的过程. 安装命令 sudo apt-get install ant GNU Make是一种构建工具,用于控制应用源代码的可执行代码和其他部分代码的生成. 安装命令 sudo a

NDK中, 如何提高脚本式语言的可读性

原文来自安卓教程网android.662p.com,转载时请注明文章的来源:http://android.662p.com/thread-5245-1-1.html [概述]     NDK开发中, 最常见的脚本式语言应该就是 GLSL(OpenGL Shading Language) , 此类语言(一般情况下)不能以单个代码文件形式编写(并不以文件形式直接参与编译), 而是需要先以字符串形式完成编码, 然后通过开发语言接口的调用来完成工作. 就这种形式的编码, 个人是挺不喜欢的, 一来不易书写

android ndk中的工具使用

1. 动态so处理: arm-linux-androideabi-readelf.exe -a XX.so > xx.txt 输出所有函数 arm-linux-androideabi-objdump.exe -dx XX.so > xx.txt 反汇编so包,此时使用 $(JNI_PROJ_PATH)/obj\local\armeabi下面带符号表的so包.JNI_PROJ_PATH为编译so包时jni文件夹的根目录 2. 静态a处理: arm-linux-androideabi-ar.exe

android NDK中sqlite3数据库的使用

工作需要使用数据库进行大量的插入工作,故此想通过使用c进行这部分工作,经过查资料,发现一篇文章比较实用: 方法1.使用源码sqlite3.h,sqlite3.c进行编译.  方法2.使用android编译好得到得libsqlite.so库    具体方法:    1) 使用adb命令 adb pull /system/lib/libsqlite.so 得到libsqlite.so库(在当前用户的根目录下). 2)把得到libsqlite.so拷贝到$NDK/platforms/android-3