android studio项目中CMake和NDK-build的区别

问题描述 投票:0回答:5

在 android studio 项目中构建

CMake
NDK
之间的实际区别是什么?我已经浏览过谷歌文档,但概念还不清楚。根据谷歌文档:

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

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

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

android c++ android-studio android-ndk ndk-build
5个回答
82
投票

为了澄清这里的一些困惑:ndk-build 是 NDK 中包含的构建系统。它使用

Android.mk
文件。 NDK 本身是为 Android 构建 C/C++ 代码所需的编译器和库的集合。 ndk-build 和 cmake 都使用 NDK。

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

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

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

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

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

如果您正在构建一个已经在其构建系统(遗留项目)中使用

Android.mk

 文件的项目,那么 
ndk-build 应该是首选。

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


26
投票

我试图给出一些解释来识别 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 文件,然后需要像 CMake 一样为 ndk-build 配置 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
文件的相对路径。


1
投票

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

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

  • cmake 提高稳定性是新项目

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


0
投票

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


0
投票

使用 C++ 代码和头文件也有区别。

在 android.mk 中,您可以使用 #include 或 #include "foo.h"

在我的例子中使用 CMakeLists #include 不起作用。我必须使用#include“foo.h”。 问题是如果你的“foo.h”有另一个#include ,它将不会被发现。所以你必须将所有#include 更改为#include "foo1.h"。这给我附加了 OpenCL 标头。

© www.soinside.com 2019 - 2024. All rights reserved.