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

时间:2016-09-20 08:41:51

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

在android studio项目中构建CMakeNDK之间的实际差异是什么?我已经通过谷歌文档,但概念尚不清楚。根据谷歌文档:

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

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

当我们需要使用什么时,任何人都可以用一个更好的解释吗?

4 个答案:

答案 0 :(得分:47)

在这里澄清一些困惑: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可能是更好的选择,因为如果您选择这样做,将来可以使跨平台工作变得更容易。

答案 1 :(得分:13)

我试图给出一些解释来确定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文件的相对路径。

答案 2 :(得分:0)

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

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

  • cmake获得更多稳定性是新项目

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

答案 3 :(得分:-1)

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