`
xiaoheliushuiya
  • 浏览: 402962 次
文章分类
社区版块
存档分类
最新评论

Android NDK学习 <五> C++ 支持

 
阅读更多
0.基础知识:
Android Platform提供一个非常小的C++ runtime 支持库(/system/lib/libstdc++)和头文件。
但此System C++库支持非常有限,不支持以下 :
<wbr>- Standard C++ Library support (except a few trivial headers).</wbr>
<wbr>- C++ exceptions support</wbr>
<wbr>- RTTI support</wbr>

但Android也提供几个其它的选择。可以通过Application.mk中APP_STL作设置(见Android<wbr>NDK学习<wbr>&lt;四&gt;<wbr>Application.mk简介</wbr></wbr></wbr>)。
设置选项有如下选择:

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++<wbr></wbr><wbr>Exceptions</wbr><wbr>,</wbr><wbr>C++<wbr></wbr></wbr><wbr>RTTI</wbr><wbr>,</wbr>Standard Library支持分别如下:

system no no no
gabi++ no yes no
stlport no yes yes
gnustl yes yes yes



1. 各Runtime简介:
1.1:System Runtime:
Android提供的C++ Runtime,它只提供几个非常少的C++ 标准头文件。如果使用它,则应用程序二进制自动的链接此Android系统libstdc++。

提供的头文件只有以下这些:
cassert cctype cerrno cfloat climits cmath csetjmp csignal cstddef cstdint cstdio cstdlib cstring ctime cwchar new stl_pair.h typeinfo utility

不支持:std::string or std::vector.
1.2:GAbi++ runtime:
这是另一个小的C++ runtime, 与System C++ 提供同样多的头文件。但它支持RTTI。 现在已经很少用了。


1.3:<wbr></wbr>STLport runtime:
STLport(http://www.stlport.org)的Android 移植版。提供完整的C++ 标准库头文件,支持RTTI,但不支持EXCEPTIONS.(不支持异常很麻烦,就需要改不少代码)

静态动态均支持:
APP_STL := stlport_shared
APP_STL := stlport_static


1.4:GNU STL runtime:
GNU 标准的C++ library. 支持更多特性。库名叫:libgnustl_shared.so,而不是其它平台通常的:libstdC++.so



2.其它事项
2.1: C++ Exceptions:
自从NDK r5,NDK Toolchain就支持异常,可是,所有C++ 代码都缺省使用-fno-exceptions编译,为的是向前兼容。

为了Enable C++ Exceptions,可以作如下动作:
在Android.mk中:
LOCAL_CPP_FEATURES += exceptions <wbr>(推荐)
</wbr>
或者:
LOCAL_CPPFLAGS += -fexceptions

或者在Application.mk中:
APP_CPPFLAGS += -fexceptions


2.2:RTTI support:
与异常类似,自动NDK r5, NDK ToolChain就支持RTTI,但在缺省情况下都是用-fno-rtti来编译C++代码。

如果想Enable RTTI;<wbr></wbr>
在Andriod.mk中:
LOCAL_CPP_FEATURES += rtti (推荐)
或者
LOCAL_CPPFLAGS += -frtti
或者在:Application.mk:
APP_CPPFLAGS += -frtti


2.3:<wbr><span style="word-wrap:normal; word-break:normal">Static runtimes:
当工程只有一个动态库用到C++ library. 则其使用静态C++库没有问题。
但当工程中有多个动态库用到C++ library(或其它静态库)时,则问题来了,每个动态库会包含静态库进去。这就有问题了,因为在内存中,就有多份COPY,那全局变量等都会有问题。

所以,当工程中多个动态库链接C++ library时,不要使用静态C++库方式。


2.4:<wbr></wbr></span><span style="word-wrap:normal; word-break:normal">Shared runtimes:
</span><span style="word-wrap:normal; word-break:normal">在使用动态库时,则需要确保C++ 动态库在其它库之前被Load到内存。

例如:
</span></wbr>
libfoo.so
libbar.so which is used by libfoo.so
libstlport_shared.so, used by both libfoo and libbar

则:
static
{
<wbr>System.loadLibrary("gnustl_shared");<wbr><wbr>System.loadLibrary("bar");
<wbr>System.loadLibrary("foo");
<wbr>}




有一点需要注意:
因为C++ 程序调用xxx-xxx-g++编译,所以使用C++命名规范命名 符号,这样,Java JNI程序就找不到对应符号了。
所以需要添加:

</wbr></wbr></wbr></wbr></wbr>
#ifdef <wbr>__cplusplus</wbr>
extern <wbr>"C"{</wbr>
#endif


function 声明。




#ifdef <wbr>__cplusplus</wbr>
}
#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
<wbr>template&lt;&gt; struct char_traits&lt;wchar_t&gt;;</wbr>

<wbr>typedef basic_string&lt;wchar_t&gt; wstring;</wbr>
#endif

所以,如果想要支持wstring,则需要定义<wbr>_GLIBCXX_USE_WCHAR_T</wbr>
于是:在Android.mk中,
在LOCAL_CXXFLAGS,LOCAL_CFLAGS中添加:
-D_GLIBCXX_USE_WCHAR_T
即可支持wstring.

更新:Sam发现,wstring在R7C版本中,编译虽然没有问题,但链接时会报错。

只有替换了NDK R8之后,才真正没有问题了。


Android C++库支持有些不妥之处,例如:<wbr></wbr>
在多Thread中使用cout,或者cout 与printf混和使用,会造成程序卡死。

注意:此处NDK版本为NDK R7C.(不同NDK版本,ndk-build所产生的Makefile并不完全相同)

文章摘自:http://blog.sina.com.cn/s/blog_602f877001014qe5.html
分享到:
评论

相关推荐

    Android NDK层录音DEMO,C/C++

    基于Opensl接口实现的录音demo,代码经过测试验证,功能正常,使用循环BUFFER实现录音和写入文件功能。需要的朋友可以参考使用

    《Android C++高级编程——使用NDK》_源码.zip

    《Android C++高级编程——使用NDK》提供了Java原生接口(JNI)的概述、Bionic API、POSIX 线程和套接字、C++支持、原生图形和声音API以及NEON/SIMD优化,在一个游戏应用案例的帮助下,你将学到很多关键技能。...

    Android C++高级编程:使用NDK(高清完整带书签)电子书

    《移动开发经典丛书·Android C++高级编程:使用NDK》中我们将学习如何用AndroidNDK通过原生代码语言去实现自己的Android应用中对性能要求较高的部分。  《移动开发经典丛书·Android C++高级编程:使用NDK》介绍了...

    Android C++高级编程——使用NDK

    不管你是想将已经存在的原生代码应用移植到Android平台上还是准备开始在Android平台上进行软件开发,使用《Android C++高级编程——使用NDK》一书提供的技术可以构建更出色的应用。本书将展示构建性能更好的复杂原生...

    Android NDK C/C++ 简单样例

    Android NDK调用C/C++ 简单样例,适合初次搭建ndk平台的人参考

    Android C++高级编程 使用NDK

    Android C++高级编程 使用NDK,Android C++高级编程 使用NDK

    Android NDK调用C++实现双进程守卫

    Android NDK调用C++实现双进程守卫 本例是从博客http://blog.csdn.net/ztemt_sw2/article/details/27101681中整理出来,分享给大家参考学习。试了一下这种方法,可以实现重启进程,但用不同的机器和不同的软件杀,...

    Android C++高级编程使用NDK [ Pro Android C++ with the NDK ]书源码

    Android C++高级编程使用NDK [ Pro Android C++ with the NDK ]书源码

    Android C++高级编程: 使用NDK

    《移动开发经典丛书·Android C++高级编程:使用NDK》中我们将学习如何用AndroidNDK通过原生代码语言去实现自己的Android应用中对性能要求较高的部分。  《移动开发经典丛书·Android C++高级编程:使用NDK》介绍了...

    android studio 使用NDK和swig编译c++示例

    android studio 使用NDK和swig编译c++示例。使用swig可以自动化编译c++函数。比较方便。http://blog.csdn.net/qq_16064871

    Android NDK环境配置

    NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk,并集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件

    android ndk开发实例代码

    android ndk 开发入门小例子。 博客地址http://blog.csdn.net/u014702653/article/details/51861013

    Android NDK Game Development Cookbook (安卓NDK游戏开发指南)

    Android NDK Game Development Cookbook A systematic guide consisting of over 70 recipes which focus on helping you build portable mobile games and aims to enhance your game development skills with ...

    Android ndk下获取系统使用时间

    Android ndk下获取系统使用时间

    Android NDK 学习

    Android NDK 学习 JavaString转C++String

    细说Android4.0NDK编程.pdf

    本书顺应Android软/硬件、云计算整合潮流,详细剖析了NDK开发中涉及的各类问题和解决方案:搭建Android NDK开发环境的每一步细节,开发第一个Android NDK程序,Android NDK中Java与C/C++代码的互相调用,Facade设计...

    Android NDK 获取系统版本号

    博客名称 : 【Android NDK 开发】在 C 代码中获取 Android 系统信息 ( NDK 项目创建 | NDK 配置 | 获取 Android 系统版本号 ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/102933704

    Android C++高级编程——使用NDK完整版

    第2章 深入了解androidndk 35 第3章 用jni实现与原生代码通信 57 第4章 使用swig自动生成jni代码 81 第5章 日志、调试及故障处理 111 第6章 bionic api入门 135 第7章 原生线程 155 第8章 posix socket api:面向...

    Android C++ 高级编程 使用ndk

    android c++高级编程详细讲述使用ndk开发android应用的各个细节,是一本学习android高级开发技术的大师级作品。

    Android C++高级编程:使用NDK(完整版带书签).pdf

    Android C++高级编程:使用NDK(完整版带书签),目前来说最好的了

Global site tag (gtag.js) - Google Analytics