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

Android-NDK:静态或共享C++;第三方Java库的运行时,android,c++,cmake,stl,android-ndk,Android,C++,Cmake,Stl,Android Ndk,我正在为Android编译一个使用JNI的第三方Java库。我读了有关在开发人员.Android上添加C++支持的相关页面,但是我仍然困惑于关于C++ STL运行时的一些问题,我希望在这里能澄清: 1-我的库无法控制它将嵌入的应用程序,因此我不知道是否还有其他库可能使用静态/共享STL。如果我使用静态的C++运行时,使用安卓IDSTL=C+++静态,那么它是安全的,还是我需要担心另一个库可能使用类似GuuStLySstatic的东西,这可能与我的冲突? 2——如果我使用共享的C++运行时,使用

我正在为Android编译一个使用JNI的第三方Java库。我读了有关在开发人员.Android上添加C++支持的相关页面,但是我仍然困惑于关于C++ STL运行时的一些问题,我希望在这里能澄清:

1-我的库无法控制它将嵌入的应用程序,因此我不知道是否还有其他库可能使用静态/共享STL。如果我使用静态的C++运行时,使用安卓IDSTL=C+++静态,那么它是安全的,还是我需要担心另一个库可能使用类似GuuStLySstatic的东西,这可能与我的冲突?

2——如果我使用共享的C++运行时,使用ANDROIDUSTL = C++ +共享,它是保证STL中的特定元素使用LBC+++运行时还是可以使用GNUSTL(如果它不存在)?例如,如果我在一个应用程序中使用共享的C++运行时(C++ +共享)的STD::string,它有另一个GnUSTLL静态库,那么我的STD::String实现是从LBC++或GnUSTL?

理想的是,我希望有一个非常静态的C++运行时版本,它包含了C++:STD::vector,STD::string和STD::MAP。我实际上计划使用类似于-fffunction的部分,如这里所述和#768

请给我建议,谢谢

环境详情

  • Pkg.Desc=Android NDK
  • 包装修订版=r15c
  • Android Studio=3.1.2
  • 系统:cmake主机操作系统:Arch Linux($uname-r%4.18.5-arch1-1-Arch)
  • 编译器:Clang++
  • STL:c++静态/c++共享

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

      使用应用程序中的所有库(C++)的单个C++运行时(以及NDK中的C++支持作为AppHySTL与大多数其他标志,如LoalAuthCfLaGor或LoalAsHythDyScript库)的警告,对于连接的本地库是相关的。(除了通过相应的Java层)可以使用不同的C++运行时。另一点是,正常构建只会将一个C++运行时共享库打包到APK中。注意版本控制也是一个潜在的危险:如果添加库的开发人员使用不同的NDK版本,则当他版本的STL运行时与代码一起工作时,可能会发生冲突或意外的副作用。

      因此,为了达到最大的灵活性,你的库应该使用静态C++运行时。这可能影响二进制的大小,但是,如果你说,你只使用有限的STL子集,这个额外的就很小。


      总之,如果使用
      libc++\u static

      构建共享库,您将不必担心。请记住,GnuSTL已被弃用,将从NDK中从r18开始删除。如果您想暂时同时支持libc++和GnuSTL,解决方案可能是提供两种版本的library.Hey@Michael,我读了那个页面。我理解关于“静态”链接的部分,但它没有提到任何关于
      共享
      运行时状态的内容。我找到的唯一与这个问题相关的是这个旧文档:“每个应用程序一个STL”该页面的部分没有提到静态链接,因此我认为该部分是普遍适用的,无论是使用STL的静态链接还是动态链接。那么第三方库如何确保它不会创建额外的STL(静态),也没有使用不符合应用程序环境的STL?我相信Facebook的瑜珈只是有一个
      c++\u静态运行时,并假设每个人都会使用
      c++
      Runtimes谢谢你的回答科恩先生。我同意你关于交流的看法,幸运的是,这不会发生。为了进一步澄清,我将链接一个额外的链接我从NDK的一个维护者那里得到的答案是:简而言之,他的意见是在r16之后使用
      c++\U共享
      ,因为gnu stl(静态和共享)已弃用。如果用户有多个STL,“可能”会出现有关名称损坏的问题。因此,如果库不与其他库通信,则使用
      c++\u static
      应该会更安全,正如您所提到的。这个问题对我来说非常困惑,因此我一定会尝试编写一个小的writeup并将其链接到此处,我一定会告诉我请说出你的名字。再次感谢科恩先生。