c++ - 适用于 Android 的 uSTL 或 STLPort?

标签 c++ android android-ndk

我正在使用 Android NDK,由于它目前不支持 STL,我想知道是否有任何优秀的人在这方面取得了成功,或者知道哪个更适合 Android 平台:uSTL 或STL端口。

编辑:
看起来另一个选项可能是 CrystaX .NET .

从他们的网站:

...customized distribution of Android NDK r3 which I have rebuilt from official sources. Support of C++ exceptions, RTTI and Standard C++ Library added.

最佳答案

STL的端口正式可在 Android NDK 版本 r5 中使用上。
它可以用作静态库或共享库。 NDK 预构建了以下实现:

  • STLport ,基于 v5.2.0 :
  • 静态 stlport_static : 如果您的项目中只有一个动态库,请使用。
  • 动态stlport_shared : 如果您的项目中有多个动态库,请使用。
  • GNU libstdc++ system (静态库)

  • 推荐的、简单的使用方法在构建时是通过在 Application.mk 中定义 APP_STL 来实现的,如下所示:
    APP_STL := stlport_static
    

    如果您想重建它(这不是必需的),请在 Application.mk 中定义 STLPORT_FORCE_REBUILD :
    STLPORT_FORCE_REBUILD := true
    

    STLport 的单元测试框架也可用。

    STLport 的当前限制 :
  • 不支持 C++ 异常
  • 不支持 RTTI
  • 支持 wchar_t 的“可能的错误”和语言环境

  • 各种链接:

    NDK 包中的文档位于以下位置(可能还有更多):
  • docsCPLUSPLUS-SUPPORT.html
  • 来源/cxx-STL/STLport
  • 来源/cxx-STL/gnu-libstdc++

  • 下载 NDK + 文档 here ;文件错误 here

    以下是 docs/CPLUSPLUS-SUPPORT.html 的摘录(来自 NDK 文档,r5)

    三、选择 C++ 标准库实现:

    默认情况下,最小 C++ 运行时系统的头文件和库
    库 (/system/lib/libstdc++.so) 在构建 C++ 源时使用。

    但是,您可以通过设置变量来选择不同的实现
    APP_STL 到 Application.mk 中的其他内容,例如:

    APP_STL := STLport_static

    选择此 NDK 提供的静态 STLport 实现。
    值 APP_STL 值如下:

    system -> 使用默认的最小 C++ 运行时库。
    STLport_static -> 使用作为静态库构建的 STLport。
    STLport_shared -> 使用作为共享库构建的 STLport。

    警告:重要警告
     AT THE MOMENT, OUR STLPORT IMPLEMENTATION DOES NOT SUPPORT EXCEPTIONS
     AND RTTI. PLEASE BE SURE TO NOT USE -fexceptions OR -frtti IN ALL
     MODULES THAT USE IT.
    

    警告:重要警告结束

    如果您有多个共享库,则首选“STLport_shared”
    使用 C++ STL 的项目,因为它避免了函数的重复
    更重要的是每个变量中的全局变量(例如 std::cout)
    他们,这可能会产生令人惊讶的结果。

    另一方面,您必须在启动时明确加载它
    应用程序,如下例所示:
     static {
         System.loadLibrary("stlport_shared");
         System.loadLibrary("foo");
         System.loadLibrary("bar");
     }
    

    “libfoo.so”和“libbar.so”都依赖于“libSTLport_shared.so”。

    注意共享库的名称如果是“libSTLport_shared.so”来避免
    与某些 Android 系统镜像的命名冲突,其中包括
    系统级 libSTLport.so(恰好不是 ABI-stable 和
    不能从 NDK 生成的机器代码中使用)。

    如果您的共享库中只有一个共享库,则首选“STLport_static”
    项目:只有您实际需要的 STL 函数和变量
    链接到你的机器代码,减少它的代码大小,你不需要
    在启动时加载动态 STLport_shared。

    四。 STLport 特定问题:

    此 NDK 为 STLport 提供预构建的静态和共享库,
    但是您可以通过定义以下内容来强制从源代码重建它
    在构建之前在您的环境或 Application.mk 中:
    STLPORT_FORCE_REBUILD := true
    

    STLport 在 BSD 风格的开源许可下获得许可。看
    sources/cxx-STL/STLport/README 以获取有关该库的更多详细信息。

    五、 future 计划:
  • 使 STLport 与 C++ 异常和 RTTI 兼容
  • 全面的 GNU libstdc++ 支持
  • uSTL 支持?
  • 关于c++ - 适用于 Android 的 uSTL 或 STLPort?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1650963/

    相关文章:

    android - 解析嵌套的 Json 数据结构?

    c++ - 类型 'wxMenuBar'必须实现继承的纯虚方法 'wxMenuBarBase::GetLabelTop'

    c++ - 我怎么知道boost线程是否完成?

    android - 自定义按钮将在单击时更改文本颜色、背景颜色和可绘制对象

    Android:混合音频

    机器人/位图.h : No such file or directory (after updating Android SDK tools to revision 14)

    android - 我们如何使用新的基于 NDK gradle 的构建器定义多个模块?

    c++ - 椭圆 block 之间的仿射变换

    c++ - Boost 程序参数可以解析一个 wstring,但强制它变成一个字符串?

    android - 如何将 TypefaceSpan 或 StyleSpan 与自定义字体一起使用?