最近在用FFmpeg做視頻播放的時(shí)候,在使用ANativeWindow *nativeWindow = ANativeWindow_fromSurface(env, surface);
總是報(bào)error: undefined reference to 'ANativeWindow_fromSurface'
渠牲,對(duì)應(yīng)的頭文件都引入了∮仍螅可是還是報(bào)未定義。然后經(jīng)過(guò)查找原來(lái)是Cmake配置出錯(cuò)了规脸。這里對(duì)NDK開(kāi)發(fā)中Cmake常用的指令做介紹坯约,其詳細(xì)介紹請(qǐng)查看:Android NDK 開(kāi)發(fā):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開(kāi)發(fā)時(shí),Cmake的配置文件
1.cmake_minimum_required(VERSION 3.4.1)
設(shè)置編譯 native library 需要最小的 cmake 版本,不設(shè)置的話會(huì)報(bào)錯(cuò)莫鸭。
2.include_directories(${JNI_LIBS_DIR}/includes)
用來(lái)向工程添加多個(gè)特定的頭文件搜索路徑
3.find_library(log-lib log)
找?guī)?/p>
4.set(JNI_LIBS_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs)
定義變量闹丐,用JNI_LIBS_DIR來(lái)代替后面的路徑
5.將本地源文件編譯成指定的so庫(kù)
#將native-lib.c 編譯成 libnative-lib.so庫(kù)
add_library(native-lib
SHARED
src/main/cpp/native-lib.c )
6.引入第三方so庫(kù)
#引入第三方 liavutil.so庫(kù),倒入后需要使用 target_link_libraries 鏈接該庫(kù),才可以直接使用該庫(kù)
add_library(avutil
SHARED
IMPORTED )
#指定要倒入庫(kù)的路徑被因,add_library卿拴,在執(zhí)行該指令 衫仑,最后鏈接才能使用
set_target_properties(avutil
PROPERTIES IMPORTED_LOCATION
${JNI_LIBS_DIR}/${ANDROID_ABI}/libavutil.so )
7.鏈接動(dòng)態(tài)庫(kù)
#添加鏈接庫(kù)(我們使用的三方庫(kù))
target_link_libraries(native-lib
avutil swresample avresample swscale avcodec avformat avfilter avdevice android
${log-lib} )
文章開(kāi)頭說(shuō)的那個(gè)錯(cuò)誤,是因?yàn)闆](méi)有鏈接
android
這個(gè)庫(kù)堕花,所以才會(huì)報(bào)錯(cuò)的文狱。
總結(jié)
通過(guò)
add_library
來(lái)指定要引入的庫(kù) ,通過(guò)set_target_properties
來(lái)指定該庫(kù)的路徑缘挽,最后通過(guò)target_link_libraries
來(lái)鏈接我們引入的庫(kù)瞄崇,只有這樣我們才能使用。