【问题标题】:Difference between CMake and NDK-build in android studio projectandroid studio 项目中 CMake 和 NDK-build 的区别
【发布时间】:2017-01-28 02:28:06
【问题描述】:

CMakeNDK 在android studio 项目中构建的实际区别是什么。我已经浏览了谷歌文档,但这个概念还不清楚。根据谷歌文档:

Android 原生开发工具包 (NDK): 一个工具集,可让您 在 Android 中使用 C 和 C++ 代码,并提供平台库 允许您管理本机活动并访问物理设备 组件,例如传感器和触摸输入。

CMake: 与 Gradle 一起构建的外部构建工具 你的原生库。如果您只计划,则不需要此组件 使用 ndk-build。

当我们需要使用什么时,任何人都可以通过示例更好地解释吗?

【问题讨论】:

  • 您可以将 CMake NDK 一起使用,而不是作为 NDK 的替代品。
  • CMake 是一种使用 NDK 的新方法,将您的本地代码构建到共享库中,并由您的应用程序的 java 代码(或纯 android 本地代码项目)使用;它是使用 NDK 包中捆绑的其他工具的构建工具。 NDK 和 CMake 属于不同的领域,我认为比较它们是不公平的;在您下载的 NDK 包中,还有另一个使用 NDK 构建原生源代码的工具,称为 ndk-build:ndk-build 工具和 cmake 具有可比性:它们解决了相同的问题。
  • 我可以看到未来:ndk-build 将被弃用,CMake 将成为统治者(直到他们决定再次打破常规并转向更闪亮的东西)。 :-)
  • cmake 显然是这里的最佳选择。 cmake 是一门完整的编程语言,它具有 for-loops、if-else、函数、变量、列表等,所有这些都可以用于满足您最苛刻的依赖相关编译需求。

标签: android c++ android-studio android-ndk ndk-build


【解决方案1】:

在这里澄清一些混淆:ndk-build 是包含在 NDK 中的构建系统。它使用Android.mk 文件。 NDK 本身是为 Android 构建 C/C++ 代码所需的编译器和库的集合。 ndk-build 和 cmake 都使用 NDK。

CMake 和 NDK 在 android studio 项目中构建的实际区别是什么。

他们使用不同的语言(自定义 makefile 与 cmake)来描述构建。理想情况下,相同描述的构建的输出没有差异,但这并不意味着没有任何错误。

当我们需要使用什么时,任何人都可以通过示例更好地解释吗?

一般来说,使用您喜欢的任何系统。

CMake 的主要优势是您可以为所有目标(Android、Linux、Windows、iOS 等)使用一组构建文件。如果您的项目是跨平台的,那么 CMake 应该会让您最轻松。它在 Android 开发人员之外也广为人知,因此 Android 新手将有更好的机会理解它。

如果您要构建的项目已经使用 Android.mk 文件作为其构建系统(旧项目),则应该首选 ndk-build。

如果您正在编写新代码,请使用您喜欢的任何代码。如果您对其中任何一个都不熟悉,cmake 可能是更好的选择,因为如果您选择这样做,将来跨平台工作会变得更容易。

【讨论】:

  • 我认为如果您是 NDK 和 cmake 工具链的新手,如果您的项目很复杂,NDK 可能是一个不错的选择。我发现与 Android 一起使用时有关 cmake 工具链的文档、指南和整体知识几乎没有。诸如 Crashlytics 之类的东西只有旧 NDK 工具等的指南。我为一个复杂的产品选择了 cmake 工具链,让它与 Gradle 一起构建很麻烦。
  • 这很好。相比之下,我们创建的大多数新示例仅在 CMake 中。
  • 我正在使用新的 AS 2.3.3,发现使用 CMAKE 我的本机库无法正确构建。如何强制 AS 使用 NDK 构建系统而不是 cmake?我什至找不到 Android.mk在从 2.3.3 AS 引入的新 JNI 示例项目中
  • 我想指出,几乎所有文档仍然假设您使用的是 Android.mk,而没有 CMake 的等效项。当 CMake 被推送为默认值时,这真的很令人沮丧,然后你发现你不支持它。
【解决方案2】:

我试图给出一些解释来确定 CMake 和 NDK-Build 和设置之间的区别:

一些初始说明:

  • Android Studio 的原生库的默认构建工具是 CMake。
  • Android Studio 也支持 ndk-build,因为现有大量项目使用构建工具包编译其原生代码。
  • 如果您要创建新的原生库,则应使用 CMake。
  • 由于存在大量遗留项目,因此包括对 ndk-build 的支持。

CMake:

与 Gradle 一起用于构建您的原生库的外部构建工具。如果您只打算使用 ndk-build,则不需要此组件。 CMake 需要一个构建脚本来了解如何构建您的本机库。对于新项目,Android Studio 会创建一个 CMake 构建脚本 CMakeLists.txt,并将其放在模块的根目录中。

如果您的原生资源还没有 CMake 构建脚本,您需要自己创建一个并包含适当的 CMake 命令。 CMake 构建脚本是一个纯文本文件,您必须将其命名为 CMakeLists.txt。

# Sets the minimum version of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build.

cmake_minimum_required(VERSION 3.4.1)

# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.

add_library( # Specifies the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/file_name.cpp )

NDK 构建:

Android Studio 还支持 ndk-build,因为大量现有/遗留项目使用构建工具包编译其原生代码。您需要自己创建一个并为 ndk-build 包含适当的 Android.mk 文件,然后需要为 ndk-build 配置与 CMake 相同的 gradle 文件。

为 CMake 和 ndk-build 配置 Gradle:

要手动配置 Gradle 以链接到您的本机库,您需要将 externalNativeBuild 块添加到您的模块级 build.gradle 文件并使用 cmake 或 ndkBuild 块进行配置:

android {
    ...
    defaultConfig {
        ...
        // This block is different from the one you use to link Gradle
        // to your CMake or ndk-build script.
        externalNativeBuild {

            // For ndk-build, instead use the ndkBuild block.
            cmake/ndkBuild {

                // Passes optional arguments to CMake.
                arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"

                    // Sets optional flags for the C compiler.
                    cFlags "-fexceptions", "-frtti"

                    // Sets a flag to enable format macro constants for the C++ compiler.
                    cppFlags "-D__STDC_FORMAT_MACROS"
            }
        }
        ndk {
            // Specifies the ABI configurations of your native
            // libraries Gradle should build and package with your APK.
            abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a'
        }
    }

    buildTypes {...}

    // Encapsulates your external native build configurations.
    externalNativeBuild {

        // Encapsulates your CMake build configurations.
        cmake {

            // Provides a relative path to your CMake build script.
            path "src/main/cpp/CMakeLists.txt"
        }

        // Encapsulates your ndkBuild build configurations.
        ndkBuild {

            // Provides a relative path to your ndkBuild Android.mk file.
            path "src/main/cpp/Android.mk"
        }
    }
}

如果要将 Gradle 链接到现有的 ndk-build 项目,请使用 ndkBuild 块而不是 cmake 块,并提供 Android.mk 文件的相对路径。

【讨论】:

  • 这几乎是官方文档逐字记录。没有提供额外的信息,也没有回答 OP 的问题。
  • 我们可以在 externalNativeBuild 中同时使用 cmake 和 ndkBuild 块吗?
  • 我可以将 cmake 和 ndkbuild 块同时用于具有不同构建系统的两个模块吗?
  • @DeclanNnadozie 是的,您可以在同一个项目的不同模块中使用不同的原生构建系统。问题是你不能轻易地将不同模块的本地部分连接在一起,即使它们都使用相同的构建系统。新的 Prefab 工具(自 AS 4.0 起可用)部分满足了这一需求。
【解决方案3】:

这里有明确的答案https://android-developers.blogspot.ru/2016/11/make-and-ndk-build-support-in-android.html。总结——按顺序选择:

  • 对 C++ 有限的项目使用 gradle 实验插件

  • 为了更稳定的 cmake 是新项目

  • ndk-build 用于遗留项目,尝试迁移到 cmake 或新插件

【讨论】:

  • "ndk-build 用于遗留项目,尝试迁移到 cmake 或新插件"。该博客文章中的任何地方都没有说明这一点。如果您成功使用 ndk-build,则没有理由切换。
  • 另外,你给这些选项的顺序不是我的阅读方式。按照我的阅读方式,cmake 是 gradle experimental 的首选。
【解决方案4】:

Android.mk 是一个包含 NDK-build 的文件,如果你使用 Cmake 构建你的应用程序,你不需要 Android.mk 而是它的 CmakeList.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 2014-07-27
    • 2019-06-25
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多