# 以前的旧版本是没有设置的,这个可以设置,也可以不设置
project("NdkDemo")
# 注意:这里并不能代表最终的版本,最终版本在app.build.gradle中设置的
cmake_minimum_required(VERSION 3.10.2)
# SHARED表示生成动态库(.so) STATIC表示生成静态库(.a)
add_library(native-lib SHARED native-lib.cpp)
file(GLOB ALL_FILE *.cpp *.c)
# 或者使用aux_source_directory
aux_source_directory(. ALL_FILE)
add_library(native-lib SHARED ${ALL_FILE})
include_directories(${CMAKE_SOURCE_DIR}/include)
if(${CMAKE_ANDROID_ARCH_ABI} MATCHES "armeabi-v7a")
include_directories(${CMAKE_SOURCE_DIR}/include/armeabi-v7a)
message("This is armeabi-v7a")
elseif(${CMAKE_ANDROID_ARCH_ABI} MATCHES "arm64-v8a")
include_directories(${CMAKE_SOURCE_DIR}/include/arm64-v8a)
message("This is arm64-v8a")
endif()
# 全部导入,需设置CMAKE_CXX_FLAGS环境变量容易出错
# 设置库文件路径 设置CMAKE_CXX_FLAGS环境变量(库的路径)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}")
# 单个导入,比较清晰,但是工作量大
# 导入静态库
add_library(testNdk STATIC IMPORTED)
# 开始真正导入
set_target_properties(testNdk PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libtestNdk.a)
# 导入动态库
add_library(testNdk SHARED IMPORTED)
# 开始真正导入
set_target_properties(testNdk PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}/libtestNdk.so)]]
# 找到log-lib库并存储为变量log
find_library(log-lib log)
target_link_libraries(native-lib testNdk ${log-lib})
# sub/CMakeLists.txt
cmake_minimum_required(VERSION 3.10.2)
project(sub)
add_library(sub test.cpp)
# 父目录下的CMakeLists.txt
cmake_minimum_required(VERSION 3.10.2)
project(test)
add_subdirectory(sub)
目录结构如下:
├── CMakeLists.txt #父目录的CMakeList.txt
├── main.cpp #源文件,包含main函数
├── sub #子目录
└── CMakeLists.txt #子目录的CMakeLists.txt
└── test.h #子目录头文件
└── test.cpp #子目录源文件
#[[
(无):重要消息
STATUS:非重要消息
WARNING:CMake警告, 会继续执行
AUTHOR_WARNING:CMake警告(dev), 会继续执行
SEND_ERROR:CMake错误, 继续执行,但是会跳过生成的步骤
FATAL_ERROR:CMake错误, 终止所有处理过程
]]
message(STATUS "print message")
# 声明变量:set(变量名 变量值),CMake中所有变量都是string类型
set(var 666)
# 引用变量
message("var = ${var}")
# 移除变量
unset(var)
# 会取不到值,因为被移除了
message("my_var = ${var}")
# 声明列表:set(列表名 值1 值2 ... 值N) 或 set(列表名 "值1;值2;...;值N")
set(list_var 1 2 3 4 5)
# 或者
set(list_var2 "1;2;3;4;5")
message("list_var = ${list_var}")
message("list_var2 = ${list_var2}")
# true(1,ON,YES,TRUE,Y,非0的值) === true
# false(0,OFF,NO,FALSE,N,IGNORE,NOTFOUND) === false
set(if_tap OFF) # 定义一个变量if_tap,值为false
set(elseif_tap ON) # 定义一个变量elseif_tap,值为ture
if(${if_tap})
message("if")
elseif(${elseif_tap})
message("elseif")
else(${if_tap}) # 可以不加入 ${if_tap}
message("else")
endif() # 结束if 可以不加
set(a "")
while(NOT a STREQUAL "xxx")
set(a "${a}x")
message(">>>>>>a = ${a}")
endwhile()
#[[
break()命令可以跳出整个循环
continue()可以继续当前循环
]]
foreach(item 1 2 3)
message("1item = ${item}")
endforeach(item) # 结束for
foreach(item 1 2 3)
message("1item = ${item}")
endforeach(item) # 结束for
foreach(item RANGE 2) # RANGE 默认从0开始
message("2item = ${item}")
endforeach(item)
foreach(item RANGE 1 6 2) # 1 3 5 step为2
message("3item = ${item}")
endforeach(item)
set(list_va3 1 2 3)
# foreach(item IN LISTS ${list_va3}) # 没有报错,没有循环
foreach(item IN LISTS list_va3) # 正规的写法
message("item = ${item}")
endforeach(item)
# CMake自定义函数和Shell的函数很类似
#[[
ARGC:表示传入参数的个数
ARGV0:表示第一个参数,ARGV1、ARGV2以此类推即可
ARGV:表示所有参数
]]
function(method n1 n2 n3)
message("call num_method method")
message("n1 = ${n1}")
message("n2 = ${n2}")
message("n3 = ${n3}")
message("ARGC = ${ARGC}")
message("arg1 = ${ARGV0} arg2 = ${ARGV1} arg3 = ${ARGV2}")
message("all args = ${ARGV}")
endfunction(method)
method(10000 2000 3000) # 调用method函数
https://cmake.org/cmake/help/latest/index.html