【问题标题】:uSTL or STLPort for Android?适用于 Android 的 uSTL 或 STLPort?
【发布时间】:2010-12-11 16:18:39
【问题描述】:

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

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

来自他们的网站:

...Android 的自定义分发 我重建的NDK r3 官方消息来源。支持 C++ 异常、RTTI 和标准 C++ 添加了库。

【问题讨论】:

标签: c++ android android-ndk


【解决方案1】:

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

  • STLport,基于 v5.2.0 :
    • 静态stlport_static:如果您的项目中只有一个动态库,请使用。
    • dynamic 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 docs, 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 了解有关该库的更多详细信息。

V.未来计划:

  • 使 STLport 与 C++ 异常和 RTTI 兼容
  • 完整的 GNU libstdc++ 支持
  • uSTL 支持?

【讨论】:

    【解决方案2】:

    Android2.3 现在支持STLport!!!

    【讨论】:

    • 在这里:developer.android.com/sdk/ndk/index.html -- 寻找“提供一个默认的 C++ STL 实现(基于 STLport)作为辅助模块......”真的是你可以在 NDK r5 中使用 STLPort;即使在 2.3 中,它似乎也不能保证在设备上发货。但它现在是 NDK 的一部分。
    【解决方案3】:

    请注意,Stjepan Rajko 的答案链接中提到的 git 存储库不再存在。替代来源位于anddev,并通过 git,位于 git://stlport.git.sourceforge.net/gitroot/stlport/stlport。我在longer discussion 发现后者在 Android 下同时使用 stlport 和 boost。

    自从第一次回答这个问题以来,我已经让 anddev STLPort 与我的库一起工作,该库也调用了 boost,包括有问题的 shared_ptr。有关我的解决方案的详细信息,请参阅this question

    【讨论】:

      【解决方案4】:

      这就是我配置 STLPort 以与 Android Froyo 一起使用的方式。

      // The code
      // The set of definitions and includes for STLPort
      // They used defined() instead of #ifdef.
      #define _STLP_HAS_INCLUDE_NEXT  1
      #define _STLP_USE_MALLOC   1
      #define _STLP_USE_NO_IOSTREAMS  1
      #include <stl/config/_android.h>
      #include <map>
      #include <string>
      
      // Android.mk
      # For Android STL support
      LOCAL_C_INCLUDES += external/stlport/stlport
      LOCAL_SHARED_LIBRARIES += libstlport
      

      安德鲁

      【讨论】:

        【解决方案5】:

        我最近遇到了一些 helper scripts and a port of STLport for Android,作者 John Ripley。

        还有一个相关的blog post with instructions of how to set it up

        我想这可能会使使用 STLport 更容易。

        【讨论】:

        • 这太棒了!迫不及待想今晚试试。不过,该死的骗子总是打断我....
        【解决方案6】:

        请注意,uSTL 与标准有很大的偏差。例如,它假定 std::string 采用 UTF-8 编码。不过看起来还是很有趣……

        【讨论】:

        • 现在这并不是真正的偏差; char(甚至wchar_t)的编码是实现定义的。在 cHAR_BIT==8 不被允许的平台上选择 UTF-8,这是合理的。
        • 看看实际的库代码(甚至是文档),你就会明白我的意思了。
        • uSTL 确实在很大程度上偏离了标准。它真的不是一个标准库的实现,而是一个完整的重新构想;查看双端队列是如何“实现”的:#define deque list.
        猜你喜欢
        • 2012-04-15
        • 2012-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多