上一篇中总结了直接引用c/c++源码,但是当源码的量很大时,我们无法直接引用源码,因为量太大了,编译一次需要很长的时间,所以这时候我们就需要先预编译出.so包或者.a包,然后再引用,这时候编译就非常快了。
上一篇中已经介绍了如何将项目配置为ndk项目,这篇就不再赘述了,下面就以FFMPeg为例,直接进入正题。
编译FFMPeg
这也不是本文的重点,我在之前的文章中也整理过如何编译FFMPeg,其实也整理过如何集成FFMPeg,但是本篇的方式更加简单直接一点。
添加so包
这里我编译出来的是armeabi-v7a架构下的so包,所以把编译好的so包放入到lib/armeabi-v7a目录下,然后在该module的build.gradle文件的android->defaultConfig下边添加:
externalNativeBuild {
cmake {
cppFlags ""
abiFilters "armeabi-v7a"
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
然后再在CMakeLists文件下,添加
set(FF ${CMAKE_SOURCE_DIR}/../../../libs/${ANDROID_ABI})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${FF}")
第一句的意思是把lib/armeabi-v7a下的文件列表赋值给变量FF
第二句的意思添加动态链接库到cxx_flags上,编译时编译器就能找到该目录
注意:因为在上文配置的abiFilters只有armeabi-v7a,所以FF变量就是lib/armeabi-v7a下的文件列表
添加头文件
把编译得到的include文件整个文件夹拷贝到cpp目录下,然后使用
include_directories(include)
就能直接把头文件引用进来了
添加一个库
例如这里添加一个叫player_util的库,包含了cpp下所有的c++源码:
file(GLOB SOURCES *.cpp)
add_library(
player_util
SHARED
${SOURCES})
将FFMPeg库链接到player_util上
最后还需要把之前添加进来的so库连接到我们创建的这个player_util库上,这样我们才能引用到,代码如下:
target_link_libraries(player_util
avformat avcodec avutil swresample swscale
log z OpenSLES android)
注意第二行FFMPeg这几个库的顺序,因为前边的引用了后边的库,所以需要把引用的库按照这个顺序连接进来才行,第三行的事Android内部的so库,因为要视频的解码和渲染的话就需要用到。
至此引用so库的方式也介绍完了。