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