这篇主要介绍CMake语法学习以及怎样把上一篇文章中编译生成的交叉编译库导入到Android项目中
由于其他原因耽误导致这篇文章间隔这么久才写好,导入的时候才发现上一篇文章中交叉编译后的库有点问题又进行重新修改。这篇文章是NDK系列的最后一篇了,算是大概知道了NDK系列的入门知识。
NDK系列文章
mk
之前是使用,现在Google基本放弃了,都采用CMake
CMake
在学习CMake之前,我们或多或少了解过其他Make工具。其他的Make工具遵循不同的标准到时执行的Makefile格式不同,比如要保证在不同平台下编译,就需要一个跨平台的Make工具,CMake就是一个跨平台的构建工具。
Cmake并不直接构建出最终的软件,通过编写CmakeList.txt文件,根据目标用户的平台进一步生成对应的Makefile文件,从而达到跨平台的目的,如Android Studio就是通过ninja。所以可以这么理解为,编写Cmake语法,通过ninja,生成Makefile。
安装CMake
1 | brew install cmake |
CMake语法入门
官网语法手册(最好的资料)
学下CMake语法,可以参考官网的文档,进入官网,然后Resource –> Documentation –> 选择最新的Documentation –> Reference Manuals中的cmake-commands(7)。就可以看到所有的命令了。
实践
Demo1 单文件
main.c文件
1 | #include <stdio.h> |
CMakeLists.txt文件
1 | # CMake 最低版本号要求 |
利用CMake命令编译生成执行文件
1 | 编译生成Makefile文件 |
Demo2 多文件
如果源文件有很多个,比如有main.c、hello.c、hello.h等,那么一个个写进去比较麻烦,如
main.c文件
1 |
|
hello.h文件
1 |
|
hello.c文件
1 |
|
CMakeLists.txt
1 | # CMake 最低版本号要求 |
Demo3 多文件多目录
新建文件夹helloDir,把Demo2中的hello.c、hello.h和新建一个新的CMakeLists.txt文件放到该目录下
main.c文件
1 | // 记得修改头文件的引用路径 |
CMakeLists.txt
1 | # CMake 最低版本号要求 |
helloDir/CMakeLists.txt
1 | # CMake 最低版本号要求 |
NDK项目之CMake
通过Android Stuido创建支持NDK的项目,就可以看到,多了一个CMakeList.txt文件。在Android Studio 2.2及其以上,构建原生库的默认工具就是CMake。
1 | # 设置cmake最低支持版本 |
同时build.gradle文件也多了一些配置
1 | android { |
添加预编译库
在上一篇文章中,分别对怎样编译Android平台上的静、动态库进行介绍,接下来,就把其编译好的库(即预编译库)放到Android Stuido项目中
引入静态库
引入libmain.a
的静态库,在新建armeabi-v7a
在cpp文件下,把libmain.a
放入其中。
1 | cmake_minimum_required(VERSION 3.6) |
修改native-lib.cpp
文件,修改后如下
1 |
|
引入动态库
引入libTest.so
动态库,动态库必须放在src/jniLibs/armeabi-v7a(不同CPU架构不同目录)
下,否则不会打包进去
1 | cmake_minimum_required(VERSION 3.6) |
修改native-lib.cpp
文件,修改内容与上面静态库一样
参考资料
-
很详细的一篇文章,从实例入手,讲解 CMake 的常见用法,单独作为一种语法来学习,而不是在Android Studio项目中进行介绍。
-
可以看一下其中的CMake常用命令章节,基本列出了CMake语法中常见的语法
Android NDK开发(一) 使用CMake构建工具进行NDK开发
简单介绍了CMake在Android Stuido中的配置,各个变量的作用