Cmake常用指令介绍
2018-04-19 本文已影响25人
慕涵盛华

最近在用FFmpeg做视频播放的时候,在使用ANativeWindow *nativeWindow = ANativeWindow_fromSurface(env, surface);
总是报error: undefined reference to 'ANativeWindow_fromSurface'
,对应的头文件都引入了。可是还是报未定义。然后经过查找原来是Cmake配置出错了。这里对NDK开发中Cmake常用的指令做介绍,其详细介绍请查看:Android NDK 开发:CMake 使用
cmake_minimum_required(VERSION 3.4.1)
include_directories(${JNI_LIBS_DIR}/includes)
find_library(log-lib log)
add_library(native-lib
SHARED
src/main/cpp/native-lib.c )
set(JNI_LIBS_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs)
add_library(avutil
SHARED
IMPORTED )
set_target_properties(avutil
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libavutil.so )
add_library(swresample
SHARED
IMPORTED )
set_target_properties(swresample
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libswresample.so )
add_library(avresample
SHARED
IMPORTED )
set_target_properties(avresample
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libavresample.so )
add_library(swscale
SHARED
IMPORTED )
set_target_properties(swscale
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libswscale.so )
add_library(avcodec
SHARED
IMPORTED )
set_target_properties(avcodec
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libavcodec.so )
add_library(avformat
SHARED
IMPORTED )
set_target_properties(avformat
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libavformat.so )
add_library( avfilter
SHARED
IMPORTED )
set_target_properties(avfilter
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libavfilter.so )
add_library(avdevice
SHARED
IMPORTED )
set_target_properties(avdevice
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libavdevice.so )
target_link_libraries(native-lib
avutil swresample avresample swscale avcodec avformat avfilter avdevice android
${log-lib} )
上述文件是做FFmpeg开发时,Cmake的配置文件
1.cmake_minimum_required(VERSION 3.4.1)
设置编译 native library 需要最小的 cmake 版本,不设置的话会报错。
2.include_directories(${JNI_LIBS_DIR}/includes)
用来向工程添加多个特定的头文件搜索路径
3.find_library(log-lib log)
找库
4.set(JNI_LIBS_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs)
定义变量,用JNI_LIBS_DIR来代替后面的路径
5.将本地源文件编译成指定的so库
#将native-lib.c 编译成 libnative-lib.so库
add_library(native-lib
SHARED
src/main/cpp/native-lib.c )
6.引入第三放so库
#引入第三方 liavutil.so库,倒入后需要使用 target_link_libraries 链接该库,才可以直接使用该库
add_library(avutil
SHARED
IMPORTED )
#指定要倒入库的路径,add_library,在执行该指令 ,最后链接才能使用
set_target_properties(avutil
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libavutil.so )
7.链接动态库
#添加链接库(我们使用的三方库)
target_link_libraries(native-lib
avutil swresample avresample swscale avcodec avformat avfilter avdevice android
${log-lib} )
文章开头说的那个错误,是因为没有链接
android
这个库,所以才会报错的。
总结
通过
add_library
来指定要引入的库 ,通过set_target_properties
来指定该库的路径,最后通过target_link_libraries
来链接我们引入的库,只有这样我们才能使用。