C++ Android的uSTL或STLPort?
我正在使用Android NDK,由于它目前不支持STL,我想知道是否有杰出的人在这方面取得了成功,或者知道哪个更适合Android平台:uSTL还是STLPort 编辑: 看起来可能还有另一种选择 从他们的网站: …Android的定制发行版 NDK r3是我从中重建的 官方消息来源。C++的支持 例外,RTTI和标准C++ 图书馆补充道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编码。看起来还是很有趣,不过…我最近遇到了一些约翰·里普利的作品 还有
请注意,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++
(静态库)系统
APP_STL := stlport_static
如果要重建它(这不是必需的),请在Application.mk中定义STLPORT\u FORCE\u rebuild:
STLPORT_FORCE_REBUILD := true
STLport的单元测试框架也可用
STLport的当前限制:
- 不支持C++异常
- 不支持RTTI
- 支持
和区域设置的“可能的错误”wchar\u t
- docsCPLUSPLUS-SUPPORT.html
- sources/cxx stl/stl端口
- sources/cxx stl/gnu libstdc++
下面是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支持
char
(甚至wchar\t
)的编码是实现定义的。在cHAR\u BIT==8的平台上选择UTF-8