CMake 构建项目Android NDK项目基础知识
本篇文章将介绍如何使用 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 集成了譬如 OpenSL、Vulkan 等 API 规范的特定实现,以实现在 java 层无法做到的功能如提升音频性能等
- 增加反编译难度
NDK 下载
可以直接通过 Android Studio >> SDK Manager >> SDK Tools 来下载最新的 NDK 包
下载后所在目录是 $(你的sdk目录)/ndk-bundle,里面有很多重要的工具如 ndk-build、ndk-gdb 等,之后会再做介绍。当然,你也可以:
- 下载过往版本的 NDK 包
- 查看 NDK 修订历史记录
关于 CMake
什么是 CMake
CMake 是一个开源的跨平台工具系列,旨在构建,测试和打包软件。CMake用于使用简单的平台和独立于编译器的配置文件来控制软件编译过程,并生成可在选择的编译器环境中使用的本机makefile和工作空间。简单点说,CMake 是一款外部构建工具,从 Android Studio 2.2 开始,Android Sudio 默认地使用 CMake 与 Gradle 搭配使用来构建原生库。
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 即可项目创建了之后,你会在 Project 目录视图下,发现比普通的创建新项目多了几个文件:cpp目录里是默认生成的 cpp 文件,CMakeLists.txt 为 CMake 构建脚本。
点开 app 层级下的 build.gradle 文件,会发现多出如下部分:
这就是前文提到的在 Gradle 使用 CMake 配置为外部构建,.externalNativeBuild 文件因此生成,其中 path 指定了构建脚本的路径。还可以补充其他参数信息,可查阅:
- CMake 参数详细信息
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})
复制代码
当然,你也可以查看:
- Android NDK 原生 API
- CMake 命令详细信息文档
编译
编译生成的apk里,就会找对应名称.so库文件啦:
- 项目的源码已上传到Github
本文为个人原创,转载请注明出处。
CMake 构建项目Android NDK项目基础知识相关推荐
- Android:Android NDK项目中C++文件中打印日志
Android NDK项目中C++文件中打印日志 工作需要,在NDK项目中的C++文件中打印日志,还是费了点劲查找 才达到自己 想要的效果了. 步骤 添加头文件 添加头文件 定义宏函数 #includ ...
- 使用CMake来进行Android NDK开发
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 前言 Android NDK开发可能在平时的项目开发中不常用到,但是这并不代表其不重要, 相反NDK开发是Android开发人员的进 ...
- Android技能树 — 树基础知识小结(一)
前言: 现在安卓面试,对于数据结构的问题也越来越多了,也经常看到别人发的面试题都是问什么红黑树,二叉树查找等,所以我们虽然不会马上就会各种难的面试题,但起码树的基础知识还是要会的,这样才能去进一步学. ...
- Android技能树 — 树基础知识小结(一),kotlin开源项目
根据上面的基础知识我画了一个归总的图(这样我就不需要写文字介绍了,啊哈哈): [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zd87TfMP-1637304075403 ...
- Android 系统 wifi基础知识
第3章 Wi-Fi基础知识 本章所涉及的源代码文件名及位置 ·wireless.h external/ kernel-headers/ original/ linux/ wireless.h ·dri ...
- Android系统学习---基础知识
目录 1.基础知识Android消息处理机制 android线程 方法一(创建线程) 方法二(创建线程)
- Android录音-音频基础知识
音频基础知识 文章目录 音频基础知识 一.采样率 二.采样位深 三.比特率 四.声道(单声道.双声道) 五.PCM元数据 音频基本概念:采样率.采样位深.比特率.声道.PCM 一.采样率 采样率(也称 ...
- JdbcTemplate基础【项目demo】【基础知识】【简单明了,一眼就会】
jdbcTemplateDemo以便更好的应用. 注意:实际大型项目中service层为复杂的逻辑处理,请自行编写. JdbcTemplate例子源码(含sql):http://www.shicish ...
- Android学习之基础知识十一 —运用手机多媒体
一.使用通知(Notification) 通知(Notification)是Android系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助 ...
最新文章
- OVS datapath包处理流程(二十)
- 受控组件和不受控组件的区别
- the virtual machine is configured for 64-bit guest operating systems
- 分享几段祖传的Python代码,拿来直接使用!
- 使用LitJson进行序列化和反序列化
- OpenShift v3:使用WildFly和MySQL的Java EE 7入门
- java requestbody map_java-如何将Map转换为RequestBody?
- python核心理念_《三天搞定Python基础概念之第一天》中文版
- mysql没有索引删除一亿数据_mysql数据库如何实现亿级数据快速清理
- 反编译python编写的exe文件的详细方法
- mysql数据库技术答案_高校邦《MySQL数据库高级技术》全套答案
- 智点软件定制**服装工厂衣服加工计件工资软件的方案
- 图数据和知识图谱,数字化转型的新引擎星环科技星环科技
- 联想小新一键恢复小孔_联想一键恢复系统怎么用?小新Air 13 Pro怎么还原操作系统?...
- 程序员值得关注的微信公众号
- 读书笔记:《重来REWORK》
- mfc 中如果存在sleep延时后按钮无法响应解决方案
- CSP-S 蒟蒻啊qaq
- 超级玛丽游戏设计(Java+GUI+J2SE)
- android 手机震动1次,Android的手机震动
热门文章
- 第5章 Python 数字图像处理(DIP) - 图像复原与重建8 - 估计噪声参数
- java中ssm付款代码,ssm实现支付宝支付功能(图文详解)
- 如何把两个查询语句合成一条 语句
- Lattice 的 Framebuffer IP核使用调试笔记之datasheet笔记
- 用JSLint精炼提升JavaScript代码
- 企业生产经营相关英文及缩写之(11)--Genenic 普通书写
- 彩信编辑器之预览功能
- python装饰器参数讲解_python装饰器的详细解析
- python生成树状图_python 生成 树状结构
- Idea运行项目报错:java.lang.OutOfMemoryError: Java heap space/ java.lang.OutOfMemoryError: GC overhead 解决方法