【发布时间】:2018-09-18 13:37:38
【问题描述】:
我正在为使用 JNI 的 Android 编译第 3 方 Java 库。我阅读了有关在 developer.android 上添加 C++ 支持的相关页面,但我仍然对有关 C++ STL 运行时的几个问题感到困惑,我希望我能在这里澄清:
1- 我的库无法控制将嵌入的应用程序,因此我不知道是否会有其他库可能使用静态/共享 STL。如果我使用带有 ANDROID_STL=c++_static 的静态 C++ 运行时,它是否安全,或者我是否应该担心另一个库可能正在使用可能与我的冲突的 gnustl_static 之类的东西?
2- 如果我使用 ANDROID_STL=c++_shared 的共享 C++ 运行时,是否可以保证 STL 中的特定元素将使用 libc++ 运行时,或者如果它不存在,是否可以使用 gnustl ?例如,如果我在具有另一个 gnustl_static 库的应用程序中使用带有共享 c++ 运行时 (c++_shared) 的 std::string,我的 std::string 实现会取自 libc++ 还是 gnustl?
理想情况下,我希望有一个非常精简的静态 c++ 运行时版本,其中 (c++_static) 仅包含 std::vector、std::string 和 std::map。我实际上打算使用这里和 #768 中描述的 -ffunction-sections 之类的东西。
请多多指教,谢谢。
环境详情
- Pkg.Desc = Android NDK
- Pkg.Revision = r15c
- Android Studio = 3.1.2
- 系统:cmake 主机操作系统:Arch Linux ($ uname -r % 4.18.5-arch1-1-ARCH)
- 编译器:Clang++
- STL:c++_static/c++_shared
【问题讨论】:
-
另外请记住,GnuSTL 已被弃用,将从 r18 开始从 NDK 中删除。如果你想暂时同时支持 libc++ 和 gnustl,解决方案可能是提供你的库的两个变体。
-
嘿@Michael,我读了那个页面。我了解有关“静态”链接的部分,但它没有提及有关
shared运行时状态的任何内容。我发现与该问题相关的唯一一个是这个旧文档:android.googlesource.com/platform/ndk/+/ics-mr0/docs/… -
该页面的 "One STL Per App" 部分未提及静态链接,因此我认为该部分是普遍适用的,无论是静态链接还是动态链接使用 STL。
-
那么第三方库如何确保它不会创建额外的 STL(静态),也不会使用不符合应用环境的 STL?我相信 Facebook 的 Yoga 只是有一个
c++_static运行时,并假设每个人都会使用c++运行时
标签: android c++ cmake stl android-ndk