【问题标题】:How to use the Gradle NDK build to compile for the host machine?如何使用 Gradle NDK 构建为主机编译?
【发布时间】:2017-05-09 10:11:58
【问题描述】:

我的场景很简单。我有一个使用带有 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'
    }
}

【问题讨论】:

    标签: android android-ndk cmake android-gradle-plugin


    【解决方案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. 通过运行 android 二进制文件的 JNI 调用 CPU 模拟器

    如果有人尝试实施第二条建议,这对 Android 生态系统来说会非常有趣。

    【讨论】:

      【解决方案2】:

      你没有。 NDK 仅针对 Android。

      【讨论】:

      • 它可能“针对”Android,但我使用 buck 构建机器本地二进制文件,它工作得非常好。这里的问题是我如何使用 gradle 工具链来实现同样的目标。
      • 是的,但 Android 的 gradle 支持only Android(至少在涉及 C++ 时,我实际上并不了解 Java)。如果您想在 gradle 中为其他系统构建 C++,我认为您最终会或多或少地编写一个单独的构建文件:docs.gradle.org/current/userguide/native_software.html
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多