【NDK】【011】CMakeLists语法详解

在介绍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 "" 
		}
	}

上一篇:c++ 编译问题


下一篇:ABI