我正在为使用JNI的Android编译一个第三方Java库。我阅读了有关在developer.android上添加C ++支持的相关页面,但我仍然对我希望可以在此处解决的一些有关C ++ STL运行时的问题感到困惑:
1-我的库无法控制将要嵌入其中的应用程序,因此我不知道是否会有其他库可能使用静态/共享STL。如果我将静态C ++运行时与ANDROID_STL = c ++ _ static一起使用,是否安全?还是我应该担心另一个库可能正在使用类似gnustl_static的库,而该库可能与我的库冲突?
2-如果我将共享C ++运行时与ANDROID_STL = c ++ _ shared一起使用,是否可以保证STL中的特定元素将使用libc ++运行时,或者如果不存在gnustl,是否可以使用它?例如,如果我在具有另一个gnustl_static库的应用程序中使用带有共享c ++运行时(c ++ _ shared)的std :: string,我的std :: string实现是从libc ++还是gnustl中获取的?
理想情况下,我想使用(c ++ _ static)精简版静态c ++运行时,其中仅包含std :: vector,std :: string和std :: map。我实际上打算使用此处和#768中所述的-ffunction-sections之类的东西。
请告知并谢谢您。
环境详细信息
答案 0 :(得分:2)
您的担忧是非常真实的。但是,如果处理得当,您可以找到一种可靠的出路。
关于在应用程序中的所有库中使用单个C ++运行时的警告(以及将NDK中的C ++支持定义为APP_STL和大多数其他标志(如LOCAL_CFLAGS或LOCAL_SHARED_LIBRARIES)的整体思想,与所连接的本机库有关。永远不会直接通信(除非通过其相应的Java层)的JNI库可以使用不同的C ++运行时。另一点是,正常的构建只会将一个C ++运行时共享库打包到APK中。请注意,版本控制也有潜在的危险:如果开发人员添加您的库的人使用的是其他NDK版本,当他的STL运行时版本与您的代码一起使用时,可能会发生冲突或意外的副作用。
因此,为了获得最大的灵活性,您的库应使用静态C ++运行时。这可能会影响二进制文件的大小,但是,就像您说的那样,如果仅使用STL的有限子集,那么此额外项将相当小。
最重要的是,如果使用libc++_static
构建共享库,您将无须担心。