Android NDK学习 <五> C++ 支持
来源:互联网 发布:口袋购物软件 编辑:程序博客网 时间:2024/04/28 19:42
0.基础知识:
Android Platform提供一个非常小的C++ runtime 支持库(/system/lib/libstdc++)和头文件。
但此System C++库支持非常有限,不支持以下 :
- Standard C++ Library support (except a few trivial headers). - C++ exceptions support - RTTI support 但Android也提供几个其它的选择。可以通过Application.mk中APP_STL 作设置(见AndroidNDK学习 )。<四> Application.mk简介
设置选项有如下选择:
system -> Use the default minimal system C++ runtime library.gabi++_static -> Use the GAbi++ runtime as a static library.gabi++_shared -> Use the GAbi++ runtime as a shared library.stlport_static -> Use the STLport runtime as a static library.stlport_shared -> Use the STLport runtime as a shared library.gnustl_static -> Use the GNU STL as a static library.gnustl_shared -> Use the GNU STL as a shared library.当APP_STL没有设置时,则缺省使用system的这个。以上几种C++库能力集对:C++Exceptions , C++ RTTI , Standard Library支持分别如下:
system no no nogabi++ no yes nostlport no yes yesgnustl yes yes yes1. 各Runtime简介:1.1:System Runtime:Android提供的C++ Runtime,它只提供几个非常少的C++ 标准头文件。如果使用它,则应用程序二进制自动的链接此Android系统libstdc++。提供的头文件只有以下这些:
cassert cctype cerrno cfloat climits cmath csetjmp csignal cstddefcstdint cstdio cstdlib cstring ctime cwchar new stl_pair.h typeinfoutility不支持:std::string or std::vector.
1.2:GAbi++ runtime:这是另一个小的C++ runtime, 与System C++ 提供同样多的头文件。但它支持RTTI。 现在已经很少用了。1.3:STLport runtime:STLport(http://www.stlport.org)的Android 移植版。提供完整的C++ 标准库头文件,支持RTTI,但不支持EXCEPTIONS.(不支持异常很麻烦,就需要改不少代码)静态动态均支持:
APP_STL := stlport_sharedAPP_STL := stlport_static1.4:GNU STL runtime:GNU 标准的C++ library. 支持更多特性。库名叫:libgnustl_shared.so,而不是其它平台通常的:libstdC++.so2.其它事项:2.1: C++ Exceptions:自从NDK r5,NDK Toolchain就支持异常,可是,所有C++ 代码都缺省使用-fno-exceptions编译,为的是向前兼容。为了Enable C++ Exceptions,可以作如下动作:在Android.mk中:
LOCAL_CPP_FEATURES += exceptions(推荐)
或者:LOCAL_CPPFLAGS += -fexceptions或者在Application.mk中:
APP_CPPFLAGS += -fexceptions2.2:RTTI support:与异常类似,自动NDK r5, NDK ToolChain就支持RTTI,但在缺省情况下都是用-fno-rtti来编译C++代码。如果想Enable RTTI;
在Andriod.mk中:LOCAL_CPP_FEATURES += rtti (推荐)或者LOCAL_CPPFLAGS += -frtti或者在:Application.mk:APP_CPPFLAGS += -frtti2.3:Static runtimes:当工程只有一个动态库用到C++ library. 则其使用静态C++库没有问题。但当工程中有多个动态库用到C++ library(或其它静态库)时,则问题来了,每个动态库会包含静态库进去。这就有问题了,因为在内存中,就有多份COPY,那全局变量等都会有问题。所以,当工程中多个动态库链接C++ library时,不要使用静态C++库方式。2.4: Shared runtimes:在使用动态库时,则需要确保C++ 动态库在其它库之前被Load到内存。例如:
libfoo.solibbar.so which is used by libfoo.solibstlport_shared.so, used by both libfoo and libbar则:
static {System.loadLibrary("gnustl_shared"); System.loadLibrary("bar"); System.loadLibrary("foo"); }有一点需要注意:因为C++ 程序调用xxx-xxx-g++编译,所以使用C++命名规范命名 符号,这样,Java JNI程序就找不到对应符号了。所以需要添加:
#ifdef__cplusplus
extern"C"{
#endiffunction 声明。
#ifdef__cplusplus
}
#endif
3. 对std::wstring支持:在NDK R7中,如果不做处理,则std::wstring会报未定义。于是Sam查找之:在:android-ndk-r7/sources/cxx-stl/gnu-libstdc++/include/bits/stringfwd.h
#ifdef _GLIBCXX_USE_WCHAR_T
template<> struct char_traits<wchar_t>;
typedef basic_string<wchar_t> wstring;
#endif所以,如果想要支持wstring,则需要定义_GLIBCXX_USE_WCHAR_T
于是:在Android.mk中,在LOCAL_CXXFLAGS,LOCAL_CFLAGS中添加:-D_GLIBCXX_USE_WCHAR_T即可支持wstring.更新:Sam发现,wstring在R7C版本中,编译虽然没有问题,但链接时会报错。只有替换了NDK R8之后,才真正没有问题了。
Android C++库支持有些不妥之处,例如:
在多Thread中使用cout,或者cout 与printf混和使用,会造成程序卡死。
注意:此处NDK版本为NDK R7C.(不同NDK版本,ndk-build所产生的Makefile并不完全相同)
原文地址:http://blog.sina.com.cn/s/blog_602f877001014qe5.html
0 0
- Android NDK学习 <五> C++ 支持
- Android NDK学习 <五> C++ 支持
- Android NDK学习 <五> C++ 支持
- Android NDK学习 <五> C++ 支持
- Android NDK学习 <五> C++ 支持
- Android NDK学习 <五> C++ 支持
- Android NDK学习 <五> C++ 支持
- Android NDK学习 <五> C++ 支持
- Android NDK学习之六、C++ 支持
- Android NDK学习 <一> C++ 支持
- Android NDK开发学习(五)
- android NDK STL 支持
- Android NDK支持RTTI
- Android NDK学习之五、Application.mk简介
- 学习ndk以及c
- Android NDK系列(五)- AS导入so三方库,使用C/C+方法
- Android NDK 调用C
- android ndk c编译
- 邢台怎样治自闭症
- 第三章第40题
- java基础——GUI、网络编程
- 外贸英文网站优化那些事儿
- 邢台怎么治疗自闭症
- Android NDK学习 <五> C++ 支持
- 邢台怎么治自闭症
- 邢台小儿自闭症yiyuan
- 邢台小儿自闭症哪家yiyuan好
- Google now终于搞定了,附带教程
- iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
- css3新属性
- 集合框架(上)
- Android NDK学习 <六> 复杂结构动态库处理和第三方库的移植