前言

随着对Android学习的越来越深入,开始接触到NDK相关知识了,想当年还为了以后没机会使用C/C++而心伤,现在终于有机会在Android上使用C/C++了,下面就来介绍一下Android Studio2.2以后带来的新特性CMake。

官方文档

关于在Android Studio2.2及以后版本上面使用CMake构建NDK项目,可以查看官方文档:传送门。里面详细介绍了CMake的安装以及使用,本篇博客也是基于此文档进行进一步说明。关于NDK环境的下载以及Demo工程的创建可以查看贴出的官方地址》》》传送门!!!

运行Demo

按照官方文档中的新建一个NDK工程,目录结构如下:

1.对应C/C++源文件(*.c、*.cpp、*h)

2.CMakeLists.txt文件为主要配置文件,具体可以查看下文的介绍。

生成SO文件。

点击状态栏上面的Bulid->Rebuild Project,生成的so在\app\build\intermediates\cmake\debug\obj\路径下。如下图所示,默认生成支持全部平台的so。不过一般来说,我们仅仅需要arm64-v8a、armeabi、armeabi-v7a甚至只需要armeabi即可。

CMakeLists.txt文件的介绍

CMakeLists.txt类似于我们以前使用ndk-build时使用的Android.mk,主要是用来配置C/C++文件的依赖关系以及生成so等,下面就以官方的Demo来做介绍。具体请查看下面贴出的中文注释。

add_library命令

命令说明:

add_library可以引入源文件(*.c、*.cpp)并将其编译为so文件,也可以导入已经编译好的so到项目中。

基本用法

add_library一共有三个参数,第一个为库名称,最终的so文件名为lib库名称.so,不过最后使用的时候只需要使用库名称即可。

比如在构建脚本中指定“native-lib”作为共享库的名称,CMake 将创建一个名称为 libnative-lib.so 的文件。不过,在 Java 代码中加载此库时,只需要加入如下代码。

第二个参数为库的版本,有SHARED以及STATIC可选,SHARED生成动态链接库(*.so),STATIC生成静态链接库(*.a)

第三个参数为编译库所需要的源文件位置,如果有多个源文件,那么使用空格或者回车隔开即可。

如果工程中有多个源文件需要编为不同的so,那么在CMakeLists.txt中使用多个add_library,并且分别指定好源文件以及生成的名字即可。Demo如下。

将使用native-lib.cpp编译出libnative-lib.so,使用native-lib2333.cpp编译出libnative-lib233.so

高级用法:

如果我们需要导入已经存在的so文件到项目中,那么在使用add_library的同时也需要使用set_target_properties指定so文件的位置,如果so文件有头文件,那么还需要使用include_directories指定头文件的位置,Demo如下,具体介绍请查看中文注释。

find_library与target_link_libraries

命令说明:

预构建的 NDK 库已经存在于 Android 平台上,因此,我们无需再构建或将其打包到 APK 中。由于 NDK 库已经是 CMake 搜索路径的一部分,所以我们不需要在本地 NDK 安装中指定库的位置 – 只需要在 CMake 中设置希望使用的库的名称,并通过target_link_libraries命令将其关联到我们自己的原生库。

基本用法

Cmake添加编译参数

在我们使用Cmake编译so的时候,默认使用的Android平台版本为minSdkVersion所指定的版本,如果我们想指定其他的版本,那么就需要添加一些配置参数。语法如下,参数名使用-D开头,多个参数使用,号隔开。

arguments-DVAR_NAME=ARGUMENT”,-DVAR_NAME=ARGUMENT”

举例:设置CMake编译版本为android-21

更多可选参数请查看文末官方文档(需科学上网),或者你也可以看看这篇博客

其他

设置so文件生成位置

在上面我们说过了,so默认生成位置为\app\build\intermediates\cmake\debug\obj\(<project-root>/<module-root>/.externalNativeBuild/cmake/<build-type>/<ABI>/),不过我们一般将so放在/src/main/jniLibs/下面,这一点我们也可以在CMakeLists.txt文件中进行设置。

设置SO文件支持的cpu类型

CMake默认生成全部cpu架构支持的so文件,但是就像上面所说的,我们一般不需要这么多的,在app/下的build.gradle文件中,配置一下即可,下面的例子是只生成armeabi架构的CPU。

官方文档:https://developer.android.com/ndk/guides/cmake.html

最后修改日期: 2017年8月3日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。