【问题标题】:Link with native libraries in different NDK modules链接不同 NDK 模块中的原生库
【发布时间】:2020-11-27 10:16:32
【问题描述】:

我有一个包含 3 个模块层的模块化应用程序架构。

底部的核心库模块和顶部的应用程序库模块和我的应用程序。每个都构建自己的本机共享库。但不仅是java代码,其中的C++代码也是相互依赖的。

所以我的“application.so”必须链接到“library.so”和“core.so”,另一方面,“library.so”必须链接“core.so”,就像您对任何分层架构的期望一样。

我可以在文件系统中看到共享的库最终都位于同一个构建目录中,但我找不到使它们相互链接的方法。 “find_library”是行不通的。而且仅仅在“target_link_libraries”中命名它们也行不通。

编辑:使用

buildFeatures { 
    prefabPublishing true
}

prefab {
    infosqueezer {
        headers "src/main/cpp/include"
    }
}

我能够生成一个 aar。但我无法将它包含到另一个模块中。调试和发布 aar 都在“library/build/output/aar/”目录中生成。这些模块在同一个项目中,所以我只需要以某种方式通过文件引用。

我正在使用

implementation project(path: ':library')

但它不拾取so文件。此外,AAR 不包含 find_package 命令查找链接库所需的任何“libraryConfig.cmake”或“library-config.cmake”。


而且整个预制过程似乎很糟糕。我只想拆分项目源代码以减少编译时间和依赖关系。 Prefab 添加了如此多的内容,这无疑是一个分发独立库的好主意,但对于内部库来说太过分了。

我需要的只是一种在另一个模块中引用生成的“library.so”文件的方法。

我知道它是 Android,但它们真的让一切变得如此糟糕吗?

【问题讨论】:

  • 您可能想详细说明您的配置与Native dependencies with AARs的不匹配之处
  • @MorrisonChang 谢谢你的链接,这可能是答案。不幸的是我不明白。这是非常缺乏记录的。我如何使用预制件?我了解其中的 cmake 部分,但不了解如何设置预制件。有分步教程吗?
  • 由于预制件是新的:android-developers.googleblog.com/2020/02/… 你最好的选择可能是示例项目github.com/android/ndk-samples/tree/main/prefab
  • 谢谢,哇,这是 20 天前的示例代码。并且不同于其他地方提到的记录在案的 gradle 选项。所以它仍在开发中,API 不稳定。我的警告灯亮着,当我使用最前沿的早期采用者的东西时,我有足够的项目流血至死。那么之前设置模块间 NDK 依赖的方法是什么?
  • 很抱歉让您走下预制路径。对于内部库,请查看developer.android.com/ndk/guides/prebuilts

标签: android android-ndk linker shared-libraries


【解决方案1】:

不支持使用 externalNativeBuild 依赖同一项目中其他模块的本机库的方式(至少部分是因为它会导致更差的构建性能,见下文)。

如前所述,如果您希望获得最佳构建性能(并且希望使用受支持的使用模型),您的项目应该为其本地代码提供一个 gradle 模块。

如果您真的希望将它们分开,那么与 AGP 一起使用的唯一方法是让它们成为独立的项目。我认为你不应该那样做。

而且整个预制过程似乎很糟糕。

这不是它的本意。螺丝刀是可怕的锤子。

我只是想拆分项目源代码以减少编译时间和依赖关系。

将 gradle 项目拆分为更多模块通常会使编译时间变得更糟,而不是更好。我想不出任何理由可以提高原生项目的构建性能,而且它很容易让它变慢,因为调用 CMake 并不便宜,而且拆分模块会成倍增加成本。

【讨论】:

    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    相关资源
    最近更新 更多