在介绍CMakeLists语法前,首先建议大家使用CMakeLists替代Android.mk来进行NDK开发
cmake/CMakeLists本来对make/Makefile进行优化后的产物,它的语法更加贴近编程语言,更易读懂
#注意,这不是一个可实际运行的CMakeLists,仅用于演示语法
#里面会有重复定义的变量和模块名,不要觉得奇怪,仅仅是为了演示
#指定cmake最小版本
cmake_minimum_required(VERSION 3.6.0)
#设置C++语法标准版本
set(CMAKE_CXX_STANDARD 11)
#设置忽略警告
add_definitions(-Wno-error=format-security)
#打印变量
message("ANDROID_ABI ${ANDROID_ABI}")
#指定头文件查找目录
include_directories(src/main/cmake/include)
#引入其它目录的cmakelist
add_subdirectory(xxx)
#通过指定源文件,构建动态库
#这个指令会生成动态库文件libhello.so
add_library(hello SHARED src/main/cmake/main.cpp)
#批量引入源文件
#这个指令只会检索单个文件夹,不会检索子文件夹
file(GLOB source src/main/cmake/*.c src/main/cmake/*.cpp)
add_library(hello SHARED ${source})
#引入预编译好的静态库
add_library(test STATIC IMPORTED)
set_target_properties(test PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/cmake/${ANDROID_ABI}/libtest.a)
#如果要引入预编译好的动态库,需要添加以下配置
#这个配置,使用项目内的相对路径作为so库的查找路径
#如果不这样配置,默认将使用绝对路径,作为so库的查找路径,在运行时将会报错
#如果项目中包含C++代码,请使用CMAKE_CXX_FLAGS代替CMAKE_C_FLAGS
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -L${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}")
#在NDK系统目录下,查找liblog.so文件,并将路径赋值给变量libLog
find_library(libLog log)
#链接自定义模块和系统模块,到要构建的动态库
target_link_libraries(hello test ${libLog})
#对于安卓6.0以上的系统,如果一个so库引用了另一个预编译好的so库,那么在代码里,只需加载主的so库即可
System.loadLibrary("hello");
#执行条件判断语句
#逻辑判断 计较字符串
set(ANDROID_ABI "areambi-v7a")
if(${ANDROID_ABI} STREQUAL "areambi")
message("armv5")
elseif(${ANDROID_ABI} STREQUAL "areambi-v7a")
message("armv7a")
else()
message("other abi")
endif()
#在Gradle中,可以通过以下选项,配置cmake参数
externalNativeBuild {
cmake {
arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_STL=gnustl_static"
cFlags ""
cppFlags ""
}
}