如何使用 Gradle NDK 构建为主机进行编译?



我的场景很简单。我有一个本机库,我使用带有 CMake 的externalNativeBuild系统进行编译。这适用于构建我的应用程序,但我想在机器本地(即非模拟器)单元测试期间加载相同的库。

如果我有一个包含以下内容的现有 Gradle NDK 设置,是否有办法重复使用它来编译主机操作系统(例如 macOS)的库?

defaultConfig {
ndk {
abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a'
}
externalNativeBuild {
cmake {
arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=c++_static'
}
}
}
externalNativeBuild {
cmake {
path 'CMakeLists.txt'
}
}

我也对这个主题做了一些研究,如果没有大量的手工工作,这是不可能的。这是我想到的:

遗憾的是,除了 Gradle 的 Aadroid 插件通过调用 CMake 或 ndk-build 专门为 Android 项目提供的内容外,Gradle 中没有开箱即用的支持。

最简单的方法似乎是使用另一个工具链调用 CMake,用于构建主机二进制文件。您可以通过使用主机工具链直接调用 Cmake 或向 Gradle 添加一些自定义任务来为您执行此操作。

C 语言中的单元测试

如果只想对 C 代码进行单元测试,可以让 CMake 编译一个使用常用库的可执行文件并对其进行测试。

Java 中的单元测试

如果要在通过 JNI 调用 C 代码的 Java 代码级别上进行测试,您还必须将 CMake 输出的库移动到正确的位置,以便在尝试加载本机库时让 JVM 找到它。

为人类解决这个问题

IMO 所有这些都比应有的困难得多。 其他替代方案,这将使它更加困难,试图

  1. 编译/解释您的 C 代码,使其在 JVM 上运行
  2. 通过运行安卓二进制文件的 JNI 调用 CPU 模拟器

如果有人尝试实施第二个建议,对于Android生态系统来说,这将是非常有趣的。

你没有。NDK 仅针对 Android。

最新更新