CMake 构建项目Android NDK项目基础知识

594 阅读2分钟

本篇文章将介绍如何使用 CMake 构建实现你的第一个 NDK 项目。

前言

你好!欢迎来到我的的学习笔记分享系列,第一次给大家分享的是 Android NDK 开发的学习笔记,让我们先开始了解 NDK 的构建方式吧! NDK 构建方式有两种,一种是 ndk-build,另一种是 CMake,从 Android Studio 2.2 开始,Android Sudio 默认地使用 CMake 作为 NDK 项目的构建工具,本文将先介绍如何使用 CMake 来构建你的第一个 NDK 项目。

关于NDK

什么是NDK

NDK 全称是 Native Development Kit,是一组可以让你在 Android 应用中编写实现 C/C++ 的工具,可以在项目用自己写源代码构建,也可以利用现有的预构建库。

为什么要使用NDK

NDK 对许多类型的 Android 应用没什么价值。 因为它不可避免地会增加开发过程的复杂性,但在一些情况下却可能很有用或者是必须的,下面列举一些 NDK 的使用目的:

  • 从设备获取更好的性能以用于计算密集型应用,例如游戏或物理模拟
  • 重复使用自己或其他开发者的 C/C++ 库,便利于跨平台。
  • NDK 集成了譬如 OpenSLVulkan 等 API 规范的特定实现,以实现在 java 层无法做到的功能如提升音频性能等
  • 增加反编译难度

NDK 下载

可以直接通过 Android Studio >> SDK Manager >> SDK Tools 来下载最新的 NDK 包

NDK 下载
下载后所在目录是 $(你的sdk目录)/ndk-bundle,里面有很多重要的工具如 ndk-buildndk-gdb 等,之后会再做介绍。当然,你也可以:

关于 CMake

什么是 CMake

CMake 是一个开源的跨平台工具系列,旨在构建,测试和打包软件。CMake用于使用简单的平台和独立于编译器的配置文件来控制软件编译过程,并生成可在选择的编译器环境中使用的本机makefile和工作空间。简单点说,CMake 是一款外部构建工具,从 Android Studio 2.2 开始,Android Sudio 默认地使用 CMakeGradle 搭配使用来构建原生库。

CMake 下载

和在 Android Studio 中下载 NDK 一样,可以直接通过 Android Studio >> SDK Manager >> SDK Tools 来下载 CMake:

CMake 下载
当然,你也可以:

使用 CMake 构建 NDK 项目

创建 NDK 项目

了解一些基础概念之后,接下来是创建一个 Demo,一步步地来看一下使用 CMake 构建的 NDK 项目里面有什么: 首先是在 Android Studio(2.2以上) 中创建一个新的项目,勾选上 Include C++ support,本文介绍将使用 Kotlin

创建新项目
然后一直往下,在自定义 C++ Support 界面保持 Toolchain Default 即可

自定义 C++ Support
项目创建了之后,你会在 Project 目录视图下,发现比普通的创建新项目多了几个文件:cpp目录里是默认生成的 cpp 文件,CMakeLists.txt 为 CMake 构建脚本。

Project 层级视图

点开 app 层级下的 build.gradle 文件,会发现多出如下部分:

app/build.gradle
这就是前文提到的在 Gradle 使用 CMake 配置为外部构建,.externalNativeBuild 文件因此生成,其中 path 指定了构建脚本的路径。还可以补充其他参数信息,可查阅:

CMakeList.txt

让我们来一步步分析默认生成的 CMakeList.txt 里包含了哪些信息——

  • cmake_minimum_required() 首先开头部分 cmake_minimum_required() 定义了所需 CMake的最低版本。
cmake_minimum_required(VERSION 3.4.1)
  • add_library() add_library() 命令用来添加库native-lib 对应着生成的库的名字,SHARED 代表为分享库,src/main/cpp/native-lib.cpp 则是指明了源文件的路径。
add_library( # Sets 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/native-lib.cpp)
  • find_library() 将 find_library()命令添加到 CMake 构建脚本中以定位 NDK 库,并将其路径存储为一个变量。可以使用此变量在构建脚本的其他部分引用 NDK 库,下面的代码则是定位 Android 特定的日志支持库并将其路径存储在 log-lib 中
find_library( # Sets the name of the path variable.
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)

注:预构建的 NDK 库已经存在于 Android 平台上,因此,无需再构建或将其打包到 APK 中。由于 NDK 库已经是 CMake 搜索路径的一部分,甚至不需要在 NDK 安装中指定库的位置,只需要向 CMake 提供你希望使用的库的名称,并将其关联到自己的原生库中。

  • target_link_libraries() 要将预构建库关联到自己的原生库,则将其添加到以下的 target_link_libraries() 命令中:
target_link_libraries( # Specifies the target library.
        native-lib

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

当然,你也可以查看:

编译

编译生成的apk里,就会找对应名称.so库文件啦:

apk

本文为个人原创,转载请注明出处。