本篇文章将介绍如何使用 CMake 构建实现你的第一个 NDK 项目。html
你好!欢迎来到个人的学习笔记分享系列,第一次给你们分享的是 Android NDK 开发的学习笔记,让咱们先开始了解 NDK 的构建方式吧! NDK 构建方式有两种,一种是 ndk-build,另外一种是 CMake,从 Android Studio 2.2 开始,Android Sudio 默认地使用 CMake 做为 NDK 项目的构建工具,本文将先介绍如何使用 CMake 来构建你的第一个 NDK 项目。java
NDK 全称是 Native Development Kit,是一组可让你在 Android 应用中编写实现 C/C++ 的工具,能够在项目用本身写源代码构建,也能够利用现有的预构建库。android
NDK 对许多类型的 Android 应用没什么价值。 由于它不可避免地会增长开发过程的复杂性,但在一些状况下却可能颇有用或者是必须的,下面列举一些 NDK 的使用目的:git
- 从设备获取更好的性能以用于计算密集型应用,例如游戏或物理模拟
- 重复使用本身或其余开发者的 C/C++ 库,便利于跨平台。
- NDK 集成了譬如 OpenSL、Vulkan 等 API 规范的特定实现,以实如今 java 层没法作到的功能如提高音频性能等
- 增长反编译难度
能够直接经过 Android Studio >> SDK Manager >> SDK Tools 来下载最新的 NDK 包 github
CMake 是一个开源的跨平台工具系列,旨在构建,测试和打包软件。CMake用于使用简单的平台和独立于编译器的配置文件来控制软件编译过程,并生成可在选择的编译器环境中使用的本机makefile和工做空间。简单点说,CMake 是一款外部构建工具,从 Android Studio 2.2 开始,Android Sudio 默认地使用 CMake 与 Gradle 搭配使用来构建原生库。api
和在 Android Studio 中下载 NDK 同样,能够直接经过 Android Studio >> SDK Manager >> SDK Tools 来下载 CMake: bash
了解一些基础概念以后,接下来是建立一个 Demo,一步步地来看一下使用 CMake 构建的 NDK 项目里面有什么: 首先是在 Android Studio(2.2以上) 中建立一个新的项目,勾选上 Include C++ support,本文介绍将使用 Kotlin。 app
点开 app 层级下的 build.gradle 文件,会发现多出以下部分: ide
让咱们来一步步分析默认生成的 CMakeList.txt 里包含了哪些信息——工具
cmake_minimum_required()
定义了所需 CMake的最低版本。cmake_minimum_required(VERSION 3.4.1)
复制代码
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()
命令添加到 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( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib})
复制代码
固然,你也能够查看:
编译生成的apk里,就会找对应名称.so库文件啦:
本文为我的原创,转载请注明出处。