C++ Android的uSTL或STLPort?

C++ Android的uSTL或STLPort?,c++,android,android-ndk,C++,Android,Android Ndk,我正在使用Android NDK,由于它目前不支持STL,我想知道是否有杰出的人在这方面取得了成功,或者知道哪个更适合Android平台:uSTL还是STLPort 编辑: 看起来可能还有另一种选择 从他们的网站: …Android的定制发行版 NDK r3是我从中重建的 官方消息来源。C++的支持 例外,RTTI和标准C++ 图书馆补充道 请注意,uSTL与标准有相当大的偏差。例如,它假定std::string采用UTF-8编码。看起来还是很有趣,不过…我最近遇到了一些约翰·里普利的作品 还有

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

编辑: 看起来可能还有另一种选择

从他们的网站:

…Android的定制发行版 NDK r3是我从中重建的 官方消息来源。C++的支持 例外,RTTI和标准C++ 图书馆补充道


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

我最近遇到了一些约翰·里普利的作品

还有一个相关的问题


我想这可能会使使用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
//代码
//STLPort的定义和包含集
//他们使用defined()而不是#ifdef。
#定义\u STLP\u有\u包含\u下一步1
#定义\u STLP\u使用\u MALLOC 1
#定义\u STLP\u使用\u无\u IOSTREAMS 1
#包括
#包括
#包括
//Android.mk
#对于Android STL支持
本地_C_包括+=外部/stlport/stlport
本地共享库+=libstlport

Andrew

注意,Stjepan Rajko答案中链接中提到的git存储库已不存在。可供选择的信息源位于,通过git,位于git://stlport.git.sourceforge.net/gitroot/stlport/stlport. 我发现后者需要在Android下同时使用stlport和boost


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

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

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

  • ,基于v5.2.0:
    • 静态
      stlport\u static
      :如果项目中只有一个动态库,请使用
    • 动态
      stlport_shared
      :在项目中有多个动态库时使用
  • GNU libstdc++
    系统
    (静态库)
建议在构建时使用它的简单方法是在Application.mk中定义APP_STL,如下所示:

APP_STL := stlport_static
如果要重建它(这不是必需的),请在Application.mk中定义STLPORT\u FORCE\u rebuild:

STLPORT_FORCE_REBUILD := true
STLport的单元测试框架也可用

STLport的当前限制

  • 不支持C++异常
  • 不支持RTTI
  • 支持
    wchar\u t
    和区域设置的“可能的错误”
各种链接:

NDK文件包中的文件可在以下位置获得(可能还有更多):

  • docsCPLUSPLUS-SUPPORT.html
  • sources/cxx stl/stl端口
  • sources/cxx stl/gnu libstdc++
下载NDK+文档;文件错误


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

III. Selecting C++标准库实现: 默认情况下,最小C++运行时系统的头和库 在构建C++源程序时使用了库(/St/Lb/LiBSTDc++)。 但是,您可以通过设置变量来选择不同的实现 APP_STL指向Application.mk中的其他内容,例如:

应用程序\u STL:=stlport\u静态

选择此NDK提供的静态STLport实现。 值应用程序的STL值如下所示:

Stase>使用默认的最小C++运行库。 stlport\u 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.
警告:重要警告结束

 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的项目,因为它避免了功能重复 更重要的是,在每个 这可能会产生令人惊讶的结果

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

 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稳定的 无法从NDK生成的机器代码中使用)

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

四、 STL端口特定问题: 此NDK为STLport提供预构建的静态和共享库, 但是,您可以通过定义以下内容来强制从源代码重新构建它 在您的环境或Application.mk中进行以下操作:

STLPORT_FORCE_REBUILD := true
STLport是根据BSD风格的开源许可证进行许可的。看见 sources/cxx stl/stlport/README了解有关该库的更多详细信息

五、未来计划:
  • 使STLPATH兼容C++异常和RTTI/LI>
  • 完全GNU libstdc++支持
  • uSTL支持

感谢指向uSTL()的指针-我以前没有听说过。也不知道uSTL。谢谢这可能是伟大的复制品!迫不及待想今晚试试。该死的恶作剧者不断打断我…现在这不是一个真正的偏差;
char
(甚至
wchar\t
)的编码是实现定义的。在
cHAR\u BIT==8的平台上选择UTF-8