java 开源so库_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库的方式也介绍完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值