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

编辑:看起来另一种选择可能是 水晶X.NET.

从他们的网站:

...我从官方来源重建的Android NDK R3的定制分发。添加了C ++异常的支持,RTTI和标准C ++库。

有帮助吗?

解决方案

,因为现在的Android2.3支持的STLport !!!

其他提示

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

  • STL端口, ,基于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 + 文档 这里 ;文件错误 这里


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

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

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

但是,您可以通过将变量app_stl设置为应用程序中的其他内容来选择其他实现。

APP_STL := stlport_static

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

系统 -> 使用默认的最小 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”。

请注意,共享库的名称如果“ libstlport_shared.so”,以避免使用包含系统级的libstlport.so的某些Android系统图像命名冲突(恰好不是ABI稳定性,并且无法从NDK生成的机器代码中使用) 。

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

四.STLport 特定问题:

该NDK为STLPORT提供了预建的静态和共享库,但是您可以通过在构建之前在环境或应用程序中定义以下以下内容来迫使其从源头进行重建:

STLPORT_FORCE_REBUILD := true

STLport 根据 BSD 风格的开源许可证获得许可。有关库的更多详细信息,请参见来源/CXX-STL/STLPORT/README。

五、未来的计划:

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

不过请注意uSTL从标准颇有几分偏差。例如,它承担的std :: string UTF-8编码。不过看起来很有趣,但...

最近,我遇到了一些辅助脚本和STLport的Android版端口,由约翰·里普利。

还有一个相关的博客文章与如何设置它的说明

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

这是我如何配置的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

安德鲁

请注意,Stjepan Rajko 的答案中的链接中提到的 git 存储库不再存在。替代来源已开启 安德夫 并且通过 git,位于 git://stlport.git.sourceforge.net/gitroot/stlport/stlport。我在一个地方发现了后者 更长的讨论 在 Android 下同时使用 stlport 和 boost。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top