Link 在不同的 NDK 模块中使用本机库

Link with native libraries in different NDK modules

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

一个核心库模块在底部,一个应用程序库模块和我的应用程序在它上面。每个都构建自己的本地共享库。但是不仅java代码,而且它们里面的C++代码也相互依赖。

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

我可以在文件系统中看到共享的 so 库最终都在同一个构建目录中,但我找不到使它们彼此 link 的方法。 “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 命令查找 link 库所需的任何“libraryConfig.cmake”或“library-config.cmake”。


而且整个预制过程似乎很糟糕。我只想拆分项目源代码以减少编译时间和依赖性。 Prefab 增加了很多东西,分发独立库肯定是个好主意,但对内部库来说就有点过分了。

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

我知道是 Android 但他们真的让一切变得如此可怕复杂吗?

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

如前所述,如果您想要最佳构建性能(并希望使用受支持的使用模型),您的项目应该有一个单独的 gradle 模块用于其本机代码。

如果您确实希望将它们分开,那么使用 AGP 进行此操作的唯一方法是将它们分开 项目。我认为你不应该那样做。

Also the whole prefab process seems to be terrible.

这不是它的意思。螺丝刀制造可怕的锤子。

I just want to split the in project source code to reduce compile time and dependencies.

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