NDK使用之引用.so开源库

上一篇中总结了直接引用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库的方式也介绍完了。

你可能感兴趣的:(NDK使用之引用.so开源库)