Android NDK:用于第三方Java库的静态或共享C++运行时
Android NDK: Static or shared C++ runtime for 3rd-party Java library
我正在为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
构建共享库,那么您将不用担心太多。
- 将静态库链接到不带-fPIC的共享库中
- C++两个源文件之间共享的枚举的静态实例
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- Android NDK:用于第三方Java库的静态或共享C++运行时
- 仅在少数方法(静态或共享库)中解析的外部符号
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 如何在共享库中保留静态库中的自由函数
- Cmake 查找模块用于区分共享库或静态库
- 指向静态常量对象的共享指针?
- 从静态库构建共享库
- 如何从静态c和c++库创建共享c库
- 将共享对象与静态库链接
- 共享库中静态功能成员的破坏顺序
- 使用 MapViewOfFile 分配静态共享内存
- 为多个类实例维护共享_ptr的静态列表
- 使用C 中的共享_ptr从公共静态成员函数访问私有构造函数
- Cython:无法调用共享库的非静态方法
- 两个C++库如何共享一个静态缓冲区?
- 在使用自动工具构建静态/共享库时,如何避免双重编译