android studio現在引入cmake可以很好地實現ndk的編寫。現在我們就使用這種方式實現ffmpeg庫的調用
1. ffmpeg編譯
此部分可以參考我們之前的文章Compile ffmpeg for Android,因此不加贅述
2. 修改CMakeLists.txt
add_library(avcodec-55
SHARED
IMPORTED)
set_target_properties(avcodec-55
PROPERTIES IMPORTED_LOCATION
../../../../libs/x86_64/libavcodec-55.so)
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
avcodec-55
${log-lib} )
//注意set_target_properties設置的路徑是相對於cpp文件的路徑
這樣我們的native-lib.cpp就可以調用ffmpeg的庫函數了
3. 增加include文件
include_directories(src/main/cpp/include)
如果沒有這句話,就不能調用ffmpeg的頭文件
//注意include_directories的路徑是相對於cMakeLists.txt的路徑。
4. link error:wrong file format
如果我們只有x86_64平臺的ffmpeg庫文件,而平時我們生成apk文件都是全平臺的。所以mips等平臺link就會出現wrong file format。
解決問題的方法:
添加平臺過濾。
defaultConfig{
...
externalNativeBuild {
cmake {
abiFilters "x86_64"
cppFlags ""
}
}
}
5.undefined reference to "avcodec_register_all"
我們已經在cmakeLists.txt中添加了頭文件,以及庫文件鏈接,但是還是找不到函數定義。
這是因爲我們頭文件引用時出現問題,因爲ffmpeg的頭文件是c頭文件
extern "C"{
#include "libavcodec/avcodec.h"
}
6. java如何調用庫文件
上面我們主要講cpp調用庫文件,此時我們需要將java如何調用
第一步,將so文件打包到apk文件中
sourceSets{
main{
jniLibs.srcDirs = ['libs']
// jniLibs.srcDirs = ['src/main/jniLibs'] #將so放到src/main/jniLibs
}
}
同時我們需要將so文件拷貝到libs文件夾下
第二步,在java文件中直接調用
System.loadLibrary("avcodec-55");
參考文章:http://lib.csdn.net/article/liveplay/49953?knId=1586