gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:40:51 26 4
gpt4 key购买 nike

我正在为使用 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。我实际上计划使用像此处和#768 中描述的 -ffunction-sections 之类的东西。

请指教,谢谢。

环境细节

  • Pkg.Desc = Android NDK
  • Pkg.Revision = r15c
  • Android Studio = 3.1.2
  • 系统:cmake 主机操作系统:Arch Linux ($ uname -r % 4.18.5-arch1-1-ARCH)
  • 编译器:Clang++
  • STL:c++_static/c++_shared

最佳答案

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

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

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

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

关于安卓NDK : Static or shared C++ runtime for 3rd-party Java library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52387886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com