uSTL或STLPort for Android?

And*_*son 31 c++ android android-ndk

我正在使用Android NDK,因为它目前不支持STL,我想知道是否有任何有这方面成功的人,或者知道哪个更适合Android平台:uSTL或STLPort的.

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

从他们的网站:

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

Sté*_*ane 33

STL的端口在Android NDK上正式提供,版本为r5.它既可以用作静态库,也可以用作共享库.NDK预构建了以下实现:

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

在构建时使用它的推荐,简单方法是在Application.mk中定义APP_STL,如下所示:

APP_STL := stlport_static
Run Code Online (Sandbox Code Playgroud)

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

STLPORT_FORCE_REBUILD := true
Run Code Online (Sandbox Code Playgroud)

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

STLport的当前限制:

  • 不支持C++异常
  • RTTI不受支持
  • "可能的错误"支持wchar_t和语言环境

各种链接:

NDK包中的文档位于以下位置(可能还有更多):

  • docsCPLUSPLUS-的support.html
  • 源/ CXX-STL/STLport的
  • 源/ CXX-STL/GNU-的libstdc ++

在这里下载NDK +文档; 在这里提出错误


以下摘自docs/CPLUSPLUS-SUPPORT.html(来自NDK docs,r5)

III.选择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.

警告:重要的CAVEAT

 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.
Run Code Online (Sandbox Code Playgroud)

警告:重要的CAVEAT结束

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

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

 static {
     System.loadLibrary("stlport_shared");
     System.loadLibrary("foo");
     System.loadLibrary("bar");
 }
Run Code Online (Sandbox Code Playgroud)

"libfoo.so"和"libbar.so"都依赖于"libstlport_shared.so".

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

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

IV.STLport特定问题:

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

STLPORT_FORCE_REBUILD := true
Run Code Online (Sandbox Code Playgroud)

STLport根据BSD风格的开源许可证授权.有关库的更多详细信息,请参阅sources/cxx-stl/stlport/README.

五,未来计划:

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


Nem*_*vic 9

请注意,uSTL偏离了标准.例如,它假定std :: string的UTF-8编码.看起来仍然很有趣,但......

  • uSTL确实在很大程度上偏离了标准.它实际上不是stdlib实现,而是整个重新构想; 看看deque是如何"实现"的:`#define deque list`. (7认同)
  • 现在这不是一个偏差; `char`(甚至`wchar_t`)的编码是实现定义的.在'cHAR_BIT == 8`的平台上选择UTF-8不仅是允许的,这是合理的. (2认同)
  • 看看实际的库代码(甚至文档),你会明白我的意思. (2认同)

Stj*_*jko 9

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

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

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


小智 9

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