安卓开发日记——记录CMake文件初识

212 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 27 天,点击查看活动详情

前言

作者日常的安卓开发工作其实是要写JNI的,所以还得用c++语言,在项目中,也能看到好几个Cmake文本,而我们的项目就是通过 CMake 和 NDK 将 C/C++ 代码编译成底层的库,然后再配合 Gradle 的编译将库打包到 APK 中,但是如果直接打开Cmake文件去看的话就会一脸茫然,上面有很多库名称,为了能稍微看懂点这个文件,作者查了一些相关资料,分享给掘友们。

正篇

首先,我们前言说过,安卓中Cmake是用来解决我们使用C++语言NDK混合开发的问题,所以安卓官方Google也给出了相应的官方指导(配置 CMake  |  Android 开发者  |  Android Developers):

image.png 根据官方的教程,我们就可以写出CMake文件,这里来简单的介绍一下写法:

首先,我们应该在我们写c++文件的同一目录下创建CMake文件(CMakeLists.txt),然后在文件头写上我们支持的CMake的使用版本,使用cmake_minimum_required()命令:

cmake_minimum_required(VERSION 3.4.1)

安卓对CMake版本的最高支持在我们AS的SDK Tool里面找,我们去选择自己需要的即可: image.png

image.png 然后再使用 add_library() 命令向 CMake 构建脚本添加源代码文件或库,其实就是指定要编译的库的名称,以及动态库还是静态库,还有要编译的文件:

add_library( # Specifies 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 )

同时跟着后面使用include_directories命令为其添加头文件的文件目录地址,让我们把C++代码的头文件包含进来,能够让CMake在编译时找到头文件:

# Specifies a path to native header files.
include_directories(src/main/cpp/include/)

其他语法呢,作者是建议去看看CMake的官网的(CMake Training (kitware.com)),前面的地址是我们CMake官网给的学习教程,有兴趣可以看看。

这部分感觉不是很容易上手,但按照官方教程来还是能应付得了日常开发的。

我们接着看CMake的构建,在安卓开发中我们需要NDK,所以CMake中我们使用find_library命令可以找到我们的NDK library并将其路径存储为一个变量,下面就是官方给的例子,用来找到 Android 专有的日志支持库,并将该库的路径存储在 log-lib 中:

find_library( # Defines the name of the path variable that stores the
              # location of the NDK library.
              log-lib

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

为了让我们的原生库可以使用log库的函数,我们还能使用target_link_libraries命令关联这两个库:

target_link_libraries( # Specifies the target library.
                       native-lib

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

以上就是差不多Google官方给的教学了,也基本可以用来搞一下简单的CMake构建了。

总结

这部分知识还是挺麻烦的,感觉无从下手,之前看安卓有大佬写过教学,正在拜读,这里也分享出来(玩Android - wanandroid.com - 学习指南)。