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 集成了譬如 OpenSLVulkan 等 API 规范的特定实现,以实现在 java 层无法做到的功能如提升音频性能等
  • 增加反编译难度

NDK 下载

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

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

  • 下载过往版本的 NDK 包
  • 查看 NDK 修订历史记录

关于 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 即可

项目创建了之后,你会在 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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux installaccess Nessus-5.2.4

1、Download: http://www.tenable.com/products/nessus/select-your-operating-system 2、Current version:Nessus-5.2.4-debian6_i386.deb 3、Install:dpkg -i Nessus-5.2.4-debian6_i386.deb # dpkg -i Nessus-5.2.4-debian6_i386.deb Selecting p…

面试官问:JS的继承

原文作者若川,掘金链接:https://juejin.im/post/5c433e216fb9a049c15f841b写于2019年2月20日,现在发到公众号声明原创,之前被《前端大全》公众号等转载阅读量超1w,知乎掘金等累计阅读量超过1w。导读:文章主…

qt 快速按行读取文件_这是知识点之Linux下分割文件并保留文件头

点击上方"开发者的花花世界",选择"设为星标"技术干货不定时送达!这是一个知识点方便快捷的给结构化数据文件分割大小并保留文件的表头,几十个G的结构化文件不仅阅读编辑麻烦,而且使用受限,因此高效…

mono 调用windows webService

1. 实现linux mono Develop中调用windows 中的webService l linux 与 windows 在一个局域网的网段中 l windows 的IIs中发布webService 2. windows 中的设置 l webService 的代码 using System; using System.Collections.Generic; using System.Linq; using S…

Linux 内存机制

转载链接:http://blog.csdn.net/tianlesoftware/article/details/5463790 一. 内存使用说明 Free 命令相对于top 提供了更简洁的查看系统内存使用情况: [rootrac1 ~]# free total used free shared buffers cached Mem: …

network中的请求信息,headers中的每一项分别是什么意义?

这里是修真院前端小课堂,每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析前端知识/技能,本篇分享的是: 【network中的请求信息,headers中的每…

学习 sentry 源码整体架构,打造属于自己的前端异常监控SDK

前言这是学习源码整体架构第四篇。整体架构这词语好像有点大,姑且就算是源码整体结构吧,主要就是学习是代码整体结构,不深究其他不是主线的具体函数的实现。文章学习的是打包整合后的代码,不是实际仓库中的拆分的代码。其余三篇分…

巴西龟吃什么

1、活虾,哈哈,巴西龟最喜欢的食物,超市很多鸡尾虾买的,就那种,要活的,锻炼它们的天性,一次一只可以吃一、两天; 2、蚶子,贝壳类,活的,整个扔进去&…

绑定dictionary 给定关键字不再字典中_VBA代码集锦-利用字典做两列数据的对比并对齐...

源数据:代码:Sub 对比()Dim arr, brr, crrDim i, j, n, lastrowA, lastrowB As Integer建立字典对象Set d CreateObject("scripting.dictionary")获取数据区域最后一行的行数lastrowA Sheets("对比对齐两列数据").Cells(Rows.Coun…

linux启动时挂载rootfs的几种方式 .

转载链接:http://blog.csdn.net/zuokong/article/details/9022707 根文件系统(在样例错误消息中名为 rootfs)是 Linux 的最基本的组件。根文件系统包含支持完整的 Linux 系统所需的所有内容。它包含所有应用程序、配置、设备、数据等 Linux 中…

PHP 手册

by:Mehdi AchourFriedhelm BetzAntony DovgalNuno LopesHannes MagnussonGeorg RichterDamien SeguyJakub Vrana其他贡献者2018-06-19Edited By: Peter Cowburn中文翻译人员:肖盛文洪建家穆少磊宋琪黄啸宇王远之肖理达乔楚戴劼褚兆玮周梦康袁玉强段小强© 1997-…

前端使用puppeteer 爬虫生成《React.js 小书》PDF并合并

前端也可以爬虫,写于2018年08月29日,现在发布到微信公众号申明原创。掘金若川 本文章链接:https://juejin.im/post/5b86732451882542af1c80821、 puppeteer 是什么?puppeteer: Google 官方出品的 headless Chrome node 库puppetee…

蜘蛛与佛的故事

最近闭关,空面四壁,窗外层峦叠嶂,窗台上只有一盆花每日陪着我,朋友们都说我要成佛了,想想也是! 于是在闭关即将结束的时候找了一篇佛的故事送给自己,希望自己能够顿悟一些"禅"机。 从前,有一座圆音寺,每天都…

信息安全管理与评估_计算机工程学院教师参加“信息安全管理与评估赛项”说明会...

看了就要关注我,喵呜~2019年3月15日下午,2019年陕西省高等职业院校技能大赛“信息安全管理与评估赛项说明会”在咸阳职业技术学院举行。出席本次会仪的有咸阳职业技术学院教务处长杨新宇、神州数码范永强经理、神州数码信息安全工程师高峰和各院校指导教…

haproxy概念和负载均衡

https://pan.baidu.com/s/1Sq2aJ35zrW2Xn7Th9j7oOA //软件百度网盘连接 在80.100虚拟机上 systemctl stop firewalld //关闭防火墙 setenforce 0 //关闭监控 yum install lrz* -y //安装上传软件 tar xf haproxy-1.5.15.tar.gz -C /opt/ //解压压缩包到/opt/ cd /op…

PHP用户注册邮箱验证激活帐号

转载链接:http://www.helloweba.com/view-blog-228.html 本文将结合实例,讲解如何使用PHPMysql完成注册帐号、发送激活邮件、验证激活帐号、处理URL链接过期的功能。 业务流程 1、用户提交注册信息。 2、写入数据库,此时帐号状态未激活。 …

知乎问答:一年内的前端看不懂前端框架源码怎么办?

知乎问答:一年内的前端看不懂前端框架源码怎么办?以下是我的回答,阅读量 1000。现在转载到微信公众号中。链接:https://www.zhihu.com/question/350289336/answer/910970733其他回答的已经很好了。刚好最近在写学习源码整体架构系…

帮自己发个求职简历

帮自己发个求职简历 发个求职信息。本人擅长Web开发,尤其擅长Flex,愿从事Web开发,最好是Web前端开发,下面是我的详细个人简历: 个人信息: 姓名:伍国耀 年龄:23 性别:男 专…

python函数 global_**Python的函数参数传递 和 global

函数的参数到底是传递的一份复制的值,还是对内存的引用?我们看下面一段代码:a []def fun(x):x.append(1)fun(a)print(a)想想一下:如果传递的是一份复制的值,那么列表a应该是不会变化的,还是空列表&#xf…

冷启动问题:如何构建你的机器学习组合?

作为即将告别大学的机器学习毕业狗的你,会不会有种迷茫的感觉?你知道 HR 最看重的是什么吗?在求职季到来之前,毕业狗要怎么做,才能受到 HR 的青睐、拿到心仪的 Offer 呢?负责帮助应届生找到机器学习工作的 …