NDK帮助文档学习--CPLUSPLUS-SUPPORT.html

原创 2012年03月30日 14:18:34

android-ndk-r7b\docs\CPLUSPLUS-SUPPORT.html

Android平台提供了一个minimal C++ runtime support library (/system/lib/libstdc++)

默认情况下,‘system’ runtime不提供如下支持

  - Standard C++ Library support (except a few trivial headers).
  - C++ exceptions support
  - RTTI support
To select the runtime you want to use, define APP_STL inside your
Application.mk to one of the following values:

    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.
IMPORTANT: Defining APP_STL in Android.mk has no effect!
If you are not using the NDK build system, you can still use the GNU STL,
see docs/STANDALONE-TOOLCHAIN.html for more details.

The capabilities of the various runtimes vary. See this table:

                 C++       C++   Standard
              Exceptions  RTTI    Library

    system        no       no        no
    gabi++        no      yes        no
    stlport       no      yes       yes
    gnustl       yes      yes       yes
I. Runtimes overview:
---------------------

I.1. System runtime:
- - - - - - - - - - -

The system runtime only provides a very small number of C++ standard headers.

This corresponds to the actual C++ runtime provided by the Android platform.
If you use it, your C++ binaries will automatically be linked against the
system libstdc++.

The only headers provided here are the following:

   cassert cctype cerrno cfloat climits cmath csetjmp csignal cstddef
   cstdint cstdio cstdlib cstring ctime cwchar new stl_pair.h typeinfo
   utility

Anything else is _not_ supported, including std::string or std::vector.


I.2. GAbi++ runtime:
- - - - - - - - - - -

This is a new minimalistic runtime that provides the same headers than
the system one, with the addition of RTTI (RunTime Type Information) support.

There is very little reason to use it right now, but it is planned to become
the basis for STLport's exceptions+RTTI support in the future.
未来将加入SDLport's exceptions
If you insist on using it, read the "RTTI Support" and
"Static runtime considerations" sections below.


I.3. STLport runtime:
- - - - - - - - - - -

This is a port of STLport (http://www.stlport.org) that can be used on
Android. It will provide you with a complete set of C++ standard library
headers, however it ONLY SUPPORTS RTTI, AND NO EXCEPTIONS!

That's because the library embeds its own copy of GAbi++.

Available as both both static and shared libraries. To use it, use either
one of these two lines in your Application.mk:

   APP_STL := stlport_shared
   APP_STL := stlport_static

Note that 'stlport_shared' is preferred, for reasons explained in
"Static runtime considerations".


I.4. GNU STL runtime:
- - - - - - - - - - -

This is the GNU Standard C++ Library (a.k.a. libstdc++-v3), providing the
more features. Note that the shared library file is named "libgnustl_shared.so"
instead of "libstdc++.so" as on other platforms.

If you want to use it, please read the "C++ Exceptions support",
"RTTI Support" and "Static runtime considerations" sections below.



II. Important Considerations:
-----------------------------


II.1. C++ Exceptions support:
- - - - - - - - - - - - - - -

The NDK toolchain supports C++ exceptions, since NDK r5, however all C++
sources are compiled with -fno-exceptions support by default, for
compatibility reasons with previous releases.
支持异常的三种方法
To enable it, use the new LOCAL_CPP_FEATURES variable in your Android.mk,
as in:

    LOCAL_CPP_FEATURES += exceptions

See docs/ANDROID-MK.html for more details about this varibale.

Another way to do the same is to define it in your LOCAL_CPPFLAGS definition
(but using LOCAL_CPP_FEATURES is preferred), as in:

    LOCAL_CPPFLAGS += -fexceptions

More simply, add a single line to your Application.mk, the setting will
automatically apply to all your project's NDK modules:

    APP_CPPFLAGS += -fexceptions

IMPORTANT: You *will* have to select a C++ runtime that supports
           exceptions to be able to link / run your code. At this point
           this means only 'gnustl_static' or "gnustl_shared'!


II.2. RTTI support:
- - - - - - - - - -
同样有三种方式
Similarly, the NDK toolchain supports C++ RTTI (RunTime Type Information)
since NDK r5, but all C++ sources are built with -fno-rtti by default for
compatibility reasons. To enable it, add the following to your module
declarations:

    LOCAL_CPP_FEATURES += rtti

This will be equivalent to:

    LOCAL_CPPFLAGS += -frtti

Or more simply to your Application.mk:

    APP_CPPFLAGS += -frtti


II.3. Static runtimes:
- - - - - - - - - - - -

Please keep in mind that the static library variant of a given C++ runtime
SHALL ONLY BE LINKED INTO A SINGLE BINARY for optimal conditions.

What this means is that if your project consists of a single shared
library, you can link against, e.g., stlport_static, and everything will
work correctly.

On the other hand, if you have two shared libraries in your project
(e.g. libfoo.so and libbar.so) which both link against the same static
runtime, each one of them will  include a copy of the runtime's code in
its final binary image. This is problematic because certain global
variables used/provided internally by the runtime are duplicated.

This is likely to result in code that doesn't work correctly, for example:

  - memory allocated in one library, and freed in the other would leak
    or even corrupt the heap.

  - exceptions raised in libfoo.so cannot be caught in libbar.so (and may
    simply crash the program).

  - the buffering of std::cout not working properly

This problem also happens if you want to link an executable and a shared
library to the same static library.

In other words, if your project requires several shared library modules,
then use the shared library variant of your C++ runtime.


II.4. Shared runtimes:
- - - - - - - - - - - -

If you use the shared library variant of a given C++ runtime, keep in mind
that you must load it before any library that depends on it when your
application starts.

As an example, let's consider the case where we have the following modules

  libfoo.so
  libbar.so which is used by libfoo.so
  libstlport_shared.so, used by both libfoo and libbar

You will need to load the libraries in reverse dependency order, as in:

  static {
    System.loadLibrary("libstlport_shared");
    System.loadLibrary("libbar");
    System.loadLibrary("libfoo");
  }


III. EXTRAS:

III.1. STLport-specific issues:
-------------------------------

This NDK provides prebuilt static and shared libraries for STLport,
but you can force it to be rebuilt from sources by defining the following
in your environment or your Application.mk before building:

    STLPORT_FORCE_REBUILD := true

STLport is licensed under a BSD-style open-source license. See
sources/cxx-stl/stlport/README for more details about the library.


III.2. GNU libstdc++ license is GPLv3 + linking exception!
----------------------------------------------------------

Be aware that the GNU libstdc++ is covered by the GPLv3 license (and *not*
the LGPLv2 or LGPLv3 as some assume), full details available here:

    http://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html

Be sure that you comply with all clauses of this license.


IV. Future Plans:
-----------------

  - Add exceptions support to GAbi++
  - Add exceptions support to STLport (once it is in GAbi++)
  - uSTL support?


相关文章推荐

NDK帮助文档学习--APPLICATION-MK.html

android-ndk-r7b\docs\APPLICATION-MK.html 需要首先阅读docs/OVERVIEW.html和ANDROID-MK.html Overview: --...

NDK帮助文档学习--ANDROID-MK.html

android-ndk-r7b\docs ANDROID-MK.html 需要首先阅读docs/OVERVIEW.html 本文介绍了Android.mk build file的语法...

NDK帮助文档学习--NDK-GDB.html

android-ndk-r7b\docs\NDK-GDB.html Usage: --------- The Android NDK r4 introduced a helper shell ...

NDK帮助文档学习--NDK-BUILD.html

android-ndk-r7b\docs\NDK-BUILD.html The Android NDK r4 introduced a new tiny shell script, named ...

NDK之CPLUSPLUS-SUPPORT(C++支持的android NDK)

本文翻译的是NDK-r9b中的CPLUSPLUS-SUPPORT.html,即"C++支持的android NDK" 在NDK中,android平台提供了一个非常小的C++运行时(runtime)支持...

JAVA eclipse(myeclipse)生成帮助文档(html或chm格式)

目录(?)[+] 转自:http://www.blogjava.net/lishunli/archive/2010/01/07/308618.html   Javadoc转换chm帮助文档的四种方...

使用HTML HELP WORKSHOP制作CHM帮助文档

 制作chm电子书完美详解   2 3 4 5 6 7 分步阅读 Microsoft开发的制...

java API chm html 1.5 1.6 中文版英文版 帮助文档

J2SE DK & API下载 ————————- http://java.sun.com/j2se/1.3/download.html http://java.sun.com/j2se/1.4...

Java API chm html 1.5 1.6 中文版英文版 帮助文档

转自:点击打开链接   J2SE DK & API下载 ————————- http://java.sun.com/j2se/1.3/download.html http://java.su...
  • CTO_51
  • CTO_51
  • 2013年04月15日 09:54
  • 1129

Delphi 利用超文本HTML文件制作系统帮助文档

超文本是目前常见的文件格式之一,许多产品的说明书、使用帮助也都采用了这种格式。Delphi处理html文件有很多方式,也很方便稍加改进就可以编写出跟调用HLP文件一样灵活的帮助系统。   1、 制...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NDK帮助文档学习--CPLUSPLUS-SUPPORT.html
举报原因:
原因补充:

(最多只允许输入30个字)