Cmake常用指令介绍

最近在用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来链接我们引入的库,只有这样我们才能使用。

关注微信公众号获取更多相关资源

Android行动派

猜你喜欢

转载自blog.csdn.net/guofudong2/article/details/81286878