从版本 r5 起,STL 端口正式在 Android NDK 中可用。
它可以用作静态库或共享库。可以使用 NDK 预构建以下实现:
-
STLport,基于 v5.2.0 :
- 静态
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 + 文档 here ;归档错误here
以下是 docs/CPLUSPLUS-SUPPORT.html 的摘录(来自 NDK docs, r5)
三。选择 C++ 标准库实现:
默认情况下,最小 C++ 运行时系统的头文件和库
库 (/system/lib/libstdc++.so) 用于构建 C++ 源代码。
但是,您可以通过设置变量来选择不同的实现
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.
警告:重要警告结束
“stlport_shared”是首选,如果你有多个共享库
使用 C++ STL 的项目,因为它避免了函数的重复
更重要的是每个变量中的全局变量(例如 std::cout)
他们,这可能会产生令人惊讶的结果。
另一方面,您必须在启动时显式加载它
应用程序,如下例所示:
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-stable 和
不能从 NDK 生成的机器代码中使用)。
如果您的共享库中只有一个共享库,则首选“stlport_static”
项目:只有您实际需要的 STL 函数和变量
链接到你的机器代码,减少它的代码大小,你不需要
在启动时加载动态 stlport_shared。
四。 STLport 特定问题:
此 NDK 为 STLport 提供预构建的静态和共享库,
但是您可以通过定义以下内容来强制从源代码重建它
在构建之前在您的环境或 Application.mk 中:
STLPORT_FORCE_REBUILD := true
STLport 在 BSD 风格的开源许可下获得许可。看
sources/cxx-stl/stlport/README 了解有关该库的更多详细信息。
V.未来计划:
- 使 STLport 与 C++ 异常和 RTTI 兼容
- 完整的 GNU libstdc++ 支持
- uSTL 支持?