一,cmake几个字段或方法的含义
1.最低支持版本
2.真正使用版本
3.find_library查找系统库(系统库所在位置与以下位置有关)
如果loca.properties文件没指定版本号系统就选择最新的
system_libs.cmake
set(NDK_SYSTEM_LIBS
"libEGL.so;
libGLESv1_CM.so;
libGLESv2.so;
libGLESv3.so;
libOpenMAXAL.so;
libOpenSLES.so;
libaaudio.so;
libamidi.so;
libandroid.so;
libbinder_ndk.so;
libc.so;
libcamera2ndk.so;
libdl.so;
libjnigraphics.so;liblog.so;
libm.so;
libmediandk.so;
libnativewindow.so;
libneuralnetworks.so;
libstdc++.so;
libsync.so;
libvulkan.so;
libz.so")
这些库的所在位置
3.编译本地库的task以及输出位置
3.1脚本语句
#设置变量
set(val 123)
message("-------------------------------------------------")
message("变量val=${val}")
message("-------------------------------------------------")
message("CMAKE_CURRENT_LIST_DIR=${CMAKE_CURRENT_LIST_DIR}")
message("CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}")
message("CMAKE_CURRENT_LIST_LINE=${CMAKE_CURRENT_LIST_LINE}")
message("CMAKE_CURRENT_LIST_FILE=${CMAKE_CURRENT_LIST_FILE}")
message("CMAKE_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}")
message("CMAKE_SOURCE_DIR=${CMAKE_SOURCE_DIR}")
message("CMAKE_ANDROID_ARCH_ABI=${CMAKE_ANDROID_ARCH_ABI}")
3.2本地库可以单独编译,它对应得task位置如下
3.3编译的动/静态库所在的位置
3.4输出日志的位置
下面两个位置也能看到日志,但因版本的原因我的看不了
二,CMake基本语法
1.脚本语句
#声明列表
set(list_val 1 2 3 4 5)
set(list_val "4;5;6;7;8")
#布尔值
message("---------------------布尔值------------------------")
#true:ON YES TRUE Y 非零值
#false:OFF NO FALSE N IGNORE NOTFOUND 0
if (TRUE)
message("真")
else ()
message("假")
endif ()
#while循环
message("---------------------while循环------------------------")
set(str "")
while (NOT str STREQUAL "xxx")
set(str ${str}x)
message(${str})
endwhile ()
#while循环
message("---------------------foreach循环1------------------------")
set(list 1 2 3 4 5 6)
foreach (item ${list})
message(${item})
endforeach ()
message("---------------------foreach循环2------------------------")
set(list1 299 300 310)
foreach (item IN LISTS list1)
message(${item})
endforeach ()
message("---------------------foreach循环3------------------------")
foreach (item RANGE 10)
message(${item})
endforeach ()
message("---------------------function------------------------")
function(FUNNAME arg0 arg1 arg2)
message("参数总数:${ARGC}")
message("arg0:${ARGV0}")
message("arg1:${ARGV1}")
message("arg2:${ARGV2}")
endfunction()
FUNNAME(22 err you)
2.输出结果
---------------------布尔值------------------------
真
---------------------while循环------------------------
x
xx
xxx
---------------------foreach循环1------------------------
1
2
3
4
5
6
---------------------foreach循环2------------------------
299
300
310
---------------------foreach循环3------------------------
0
1
2
3
4
5
6
7
8
9
10
---------------------function------------------------
参数总数:3
arg0:22
arg1:err
arg2:you
三,修改CmakeList.txt文件路径
1.移动CmakeList.txt文件位置
2.build.gradle下修改CmakeList文件路径
android {
...
externalNativeBuild {
cmake {
// path "src/main/cpp/CMakeLists.txt"
path "src/main/CMakeLists.txt"
//cmake真正使用的版本
version "3.10.2"
}
}
...
}
3.CmakeList文件相应改动
3.1源文件所在目录
3.2改动前
#cnake最低支持版本
cmake_minimum_required(VERSION 3.10.2)
project("ffmpeg_test")
#TODO 第一步,导入头文件
include_directories("include")
#TODO 第二步批量导入所有源文件
aux_source_directory("${CMAKE_SOURCE_DIR}" my_source_path)
#TODO 第三步 导入库文件 CMAKE_SOURCE_DIR=CMakeList.txt所在位置
#静态库的位置
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/${CMAKE_ANDROID_ARCH_ABI}")
#动态库的位置
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}")
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
${my_source_path})
find_library( # Sets the name of the path variable.
log-lib
log)
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
#TODO 第四步 将ffmpeg相关的库链接到总库
${log-lib}
avformat
avfilter
swscale
avcodec
avutil
)
3.3改动后
#cnake最低支持版本
cmake_minimum_required(VERSION 3.10.2)
project("ffmpeg_test")
#TODO 第一步,导入头文件
include_directories("cpp/include")
#TODO 第二步批量导入所有源文件
aux_source_directory("${CMAKE_SOURCE_DIR}/cpp" my_source_path)
#TODO 第三步 导入库文件 CMAKE_SOURCE_DIR=CMakeList.txt所在位置
#静态库的位置
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/cpp/${CMAKE_ANDROID_ARCH_ABI}")
#动态库的位置
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/jniLibs/${CMAKE_ANDROID_ARCH_ABI}")
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
${my_source_path})
find_library( # Sets the name of the path variable.
log-lib
log)
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
#TODO 第四步 将ffmpeg相关的库链接到总库
${log-lib}
avformat
avfilter
swscale
avcodec
avutil
)