android - 如何使用 Gradle NDK build 为主机编译?

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

我的场景很简单。我有一个本地库,我使用带有 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 所有这一切都比它应该的要难得多。 其他替代方案,这将使它变得更加困难,正在尝试

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

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

关于android - 如何使用 Gradle NDK build 为主机编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43867014/

相关文章:

java - 使用双数组的最佳实践

ubuntu - 加载共享库时出错 : libhdf5. so.101:无法打开共享对象文件

android - 覆盖静音模式和/或媒体音量

android - 仅在编辑器或开发版本 (Unity 3D) 中登录 Facebook

android - 我想在 WebView 中下载文件,并在 Activity 中而不是在进度对话框中显示进度

c++ - 手动设置 IntelliSense 包含目录 (C++)

c++ - 在使用库和 CMake 时遇到问题

android - 如何在 AndroidManifest.xml 中为 Android 深度链接注入(inject)主机和架构

java - Android - 为什么我的 Activity 被破坏了?

android - ffmpeg编译时出错