31

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

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

从他们的网站:

...我从官方来源重建的 Android NDK r3 的定制发行版。添加了对 C++ 异常、RTTI 和标准 C++ 库的支持。

4

6 回答 6

33

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

  • STLport,基于 v5.2.0 :
    • static 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 + 文档;在此处提交错误


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

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

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

但是,您可以通过将变量 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.

警告:重要警告结束

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

另一方面,您必须在启动应用程序时显式加载它,如下例所示:

 static {
     System.loadLibrary("stlport_shared");
     System.loadLibrary("foo");
     System.loadLibrary("bar");
 }

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

请注意共享库的名称 if "libstlport_shared.so" 以避免与某些包含系统级 libstlport.so 的 Android 系统映像发生命名冲突(它恰好不是 ABI 稳定的,并且不能从 NDK 生成的机器代码中使用) .

如果您的项目中只有一个共享库,则首选“stlport_static”:只有您实际需要的 STL 函数和变量将链接到您的机器代码,从而减少其代码大小,并且您无需加载动态 stlport_shared启动。

四。STLport 特定问题:

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

STLPORT_FORCE_REBUILD := true

STLport 在 BSD 风格的开源许可下获得许可。有关该库的更多详细信息,请参阅sources/cxx-stl/stlport/README。

五、未来计划:

  • 使 STLport 与 C++ 异常和 RTTI 兼容
  • 全面的 GNU libstdc++ 支持
  • uSTL 支持?
于 2010-12-17T07:50:40.003 回答
9

我最近遇到了 John Ripley的一些帮助脚本和 Android 的 STLport 端口。

还有一篇相关的博客文章,其中包含如何设置的说明

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

于 2009-10-30T20:00:06.570 回答
9

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

于 2009-10-30T17:41:19.360 回答
9

现在从Android2.3开始支持STLport!!!

于 2010-12-13T14:08:50.747 回答
3

这就是我将 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

安德鲁

于 2010-11-05T16:44:13.277 回答
0

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

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

于 2010-12-02T22:26:53.323 回答