CMake如何为Android安装共享STL库?

wlzqhblo  于 2023-08-05  发布在  Android
关注(0)|答案(1)|浏览(122)

根据Android NDK文档(https://android.googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md#STL)。
如果使用共享变体,则APK中必须包括libc++_shared.so。
因此,作为CMake安装的一部分,如果CMAKE_ANDROID_STL_TYPE等于c++_shared,我希望在CMake安装期间安装libc++_shared.so
我尝试使用install(RUNTIME_DEPENDENCY_SET,但它似乎不适用于Android版本。CMake 3.27
请注意,文件(GET_RUNTIME_DEPENDENCIES)仅支持收集Windows、Linux和macOS平台的运行时依赖项,因此install(RUNTIME_DEPENDENCY_SET)具有相同的限制。
我有一个解决方案,涉及一个python脚本来为我正在编译的ABI找到合适的libc++_shared.so。但我希望有个更好的解决方案。

plicqrtu

plicqrtu1#

以下是我提出的解决方案:
注意事项:

  • abis.json被解析以获得三元组,因为CMake Android工具链不提供它。该方法足够稳健以处理未来的ABI。
  • 由于使用了string(JSON,因此至少需要CMake 3.19
  • CMAKE_SYSROOT由android工具链设置到适当的位置

支持文档:

  • https://android.googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md#architectures
  • abis.json让我们可以查询基于CMAKE_ANDROID_ARCH_ABI的三元组
  • https://android.googlesource.com/platform/ndk/+/master/docs/BuildSystemMaintainers.md#STL
  • “此库已安装到<NDK>/sysroot/usr/lib/<triple>。”
if ("${CMAKE_ANDROID_STL_TYPE}" MATCHES "shared")
    file(READ "${CMAKE_ANDROID_NDK}/meta/abis.json" JSON_FILE)
    string(JSON TRIPLE GET "${JSON_FILE}" "${CMAKE_ANDROID_ARCH_ABI}" "triple")
    install(FILES "${CMAKE_SYSROOT}/usr/lib/${TRIPLE}/libc++_shared.so" DESTINATION "${CMAKE_INSTALL_LIBDIR}")
endif()

字符串
编辑:
似乎目前惯用的答案是使用Android Gradle插件来为您处理此问题。
链接到与Android NDK开发人员的相关对话:https://github.com/android/ndk/issues/1905
因此,上述代码仅在您不想使用Android Gradle插件时才有用。

相关问题