我的场景很简单。我有一个本地库,我使用带有 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 在您尝试加载 native 时找到它图书馆。
为人类解决这个问题
IMO 所有这一切都比它应该的要难得多。 其他替代方案,这将使它变得更加困难,正在尝试
- 编译/解释您的 C 代码,使其在 JVM 上运行或
- 通过运行 android 二进制文件的 JNI 调用 CPU 模拟器
如果有人尝试实现第二条建议,这对 Android 生态系统来说将非常有趣。
关于android - 如何使用 Gradle NDK build 为主机编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43867014/