如何使用Gradle NDK构建来编译主机?

时间:2017-05-09 10:11:59

标签: android android-ndk cmake android-gradle

我的情景非常简单。我有一个本机库,我使用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'
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

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

C中的单元测试

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

Java中的单元测试

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

为人类解决这个问题

IMO所有这一切都比它应该更难。 其他替代方案,这将使其更难以尝试

  1. 编译/解释您的C代码,使其在JVM或
  2. 上运行
  3. 通过运行android二进制文件的JNI调用CPU模拟器
  4. 对于Android生态系统来说,如果有人专注于实施第二个建议,那将非常有趣。

答案 1 :(得分:-1)

你没有。 NDK仅针对Android。