Android NDK:用于第三方Java库的静态或共享C++运行时

Android NDK: Static or shared C++ runtime for 3rd-party Java library

本文关键字:静态 共享 C++ 运行时 NDK 用于 第三方 Java Android      更新时间:2023-10-16

我正在为Android编译一个使用JNI的第三方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的部分,如这里和#768所述。

请提出建议并表示感谢。

环境详细信息

  • Pkg.Desc=Android NDK
  • Pkg.修订=r15c
  • Android Studio=3.1.2
  • system:cmake主机OS:Arch Linux($uname-r%4.18.5-arch1-1-Arch)
  • 编译器:Clang++
  • STL:c++_static/c++_shared

您的担忧是非常真实的。但如果处理得当,你可以找到一条稳健的出路。

关于在应用程序中的所有库中使用单个C++运行时的警告(以及将NDK中的C++支持定义为app_STL与大多数其他标志(如LOCAL_flags或LOCAL_SHARED_libraries)相比的整个想法)与连接的本机库相关。从不直接通信(除非通过相应的Java层)的JNI库可以使用不同的C++运行时。另一点是,正常构建只会将一个C++运行时共享库打包到APK中。请注意,版本控制也是一个潜在的危险:如果添加库的开发人员使用不同的NDK版本,那么当他的STL运行时版本与您的代码一起使用时,可能会出现冲突或意外的副作用。

因此,为了实现最大的灵活性,您的库应该使用静态C++运行时。这可能会影响二进制文件的大小,但如果像您所说的那样,您只使用STL的有限子集,那么这个额外的子集将相当小。

最重要的是,如果使用libc++_static构建共享库,那么您将不用担心太多。