Sol*_*dak 5 c++ android stl cmake android-ndk
我正在为使用 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。我实际上计划使用类似 -ffunction-sections 的内容,如此处和 #768 中所述。
请各位指教并谢谢。
环境详情
你的担忧是非常真实的。但如果处理得当,你可以找到一条稳健的出路。
关于在应用程序中的所有库中使用单个 C++ 运行时的警告(以及在 NDK 中将 C++ 支持定义为 APP_STL 与大多数其他标志(例如 LOCAL_CFLAGS 或 LOCAL_SHARED_LIBRARIES)的整个想法,与连接的本机库相关。JNI 库从不直接通信(除非通过相应的 Java 层)可以使用不同的 C++ 运行时。另一点是,正常构建只会将一个 C++ 运行时共享库打包到 APK 中。请注意,版本控制也是一个潜在的危险:如果开发人员添加了您的库使用不同的 NDK 版本,当他的 STL 运行时版本与您的代码一起使用时,可能会出现冲突或意外的副作用。
因此,为了实现最大的灵活性,您的库应该使用静态 C++ 运行时。这可能会影响二进制文件的大小,但如果正如您所说,您仅使用 STL 的有限子集,则这个额外的部分将相当小。
最重要的是,如果使用libc++_static
.