CMake是一款比make更强大的编译自动配置工具,它可以根据不同平台、不同的编译器,并通过CMakeLists.txt文件中简单的语句来描述所有平台的编译过程,生成相应的Makefile文件或project文件。CMake被引入于AndroidStudio2.2,其目的是替代原有的JNI/DNK开发方法,使AS在进行JNI/NDK时更加的方便、高效。CMake的优势如下:
(1) 允许直接在C/C++代码中加入断点,调试;
(2) 在Java层中使用“ctrl+左键”快捷键能够直接进入本地方法对应的C/C++代码中;
(3) 在C/C++中使用“ctrl+鼠标点击”快捷键能够直接进入头文件或库;
(4) 自动生成函数原型头文件,无需配置android.useDeprecatedNdk=true属性;
CMakeLists.txt:cmake脚本配置文件,cmake会根据该脚本文件中的指令去编译相关的C/C++源文件,并将编译后产物生成共享库或静态块,然后Gradle将其打包到APK中。CMakeLists.txt文件解析如下:
# 指定cmke版本
cmake_minimum_required(VERSION3.4.1)
# add_library()命令用于向CMake添加依赖源文件或库
# 指令需传入三个参数(函数库名称、库类型、依赖源文件相对路径)
add_library( # 生成函数库的名称,即libnative-lib.so或libnative-lib.a(lib和.so/.a默认缺省)
native-lib
# 生成库类型:动态库为SHARED,静态库为STATIC
SHARED
# 依赖的c/cpp文件(相对路径)
src/main/cpp/native-lib.cpp )
# find_library()命令用于定位NDK中的库
# 需传入两个参数(path变量、ndk库名称)
find_library( # 设置path变量的名称,这里为NDK中的日志库
log-lib
#指定cmake查询库的名称
#即在ndk开发包中查询liblog.so函数库,将其路径赋值给log-lib
log )
#target_link_libraries()命令用于指定要关联到的原生库的库
target_link_libraries(# 指定目标库,与上面指定的函数库名一致
native-lib
# 链接的库,根据log-lib变量对应liblog.so函数库
${log-lib} )