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

java 开源so库_NDK使用之引用.so开源库相关推荐

  1. 优秀Java程序员应该知道的20个实用开源库

    一个优秀且经验丰富的Java开发人员的特点之一是对API的广泛了解,包括JDK和第三方库.我花了很多时间学习API,特别是在阅读Effective Java 3rd Edition之后,Joshua ...

  2. java语音开源_号外!号外!百度语音开源库更新了

    [开源:ReactNative集成百度语音开源库,](CSDN-专业IT技术社区-登录)在这篇文章中作者开源了一个ReactNative集成百度语音合成的组件库,今天通过查看Github上的关于开源r ...

  3. 使用 Visual Studio 的属性表快速引用第三方的库

    1 项目配置 1.1 传统配置方式 自从我开始使用 Visual C++ 系列开发工具开始,配置项目头文件目录,库文件目录几乎形成了肌肉记忆.由于 C/C++ 语言的特点,这些目录的位置如果设置不当, ...

  4. 【Android RTMP】Android Studio 集成 x264 开源库 ( Ubuntu 交叉编译 | Android Studio 导入函数库 )

    文章目录 安卓直播推流专栏博客总结 一. x264 简介 二. x264 交叉编译 三. Android Studio 导入函数库 四. 交叉编译版本 五. GitHub 项目地址 安卓直播推流专栏博 ...

  5. 如何参加java开源项目_有哪些适合大学生的开源项目?怎么参与?

    谢邀.题主的问题有点大,其实有很多优秀的适合大学生参与的开源项目,在这里就十分粗糙的将大学生定义为初学者好了,并分类推荐 Java / Java Web / C++ / C / C# / PHP / ...

  6. 支持C/C++、Java、python、Matlab等语言的第三方机器学习库汇总

    C 通用机器学习 Recommender - 一个产品推荐的C语言库,利用了协同过滤. 计算机视觉 CCV - C-based/Cached/Core Computer Vision Library ...

  7. Java中传参数--值传递和引用传递

    ** Java中传参数–值传递和引用传递 ** 在Java中,传参数分为值传递和引用传递. 在Java中的数据类型分为两大类:一类是引用类型,也叫类类型(除了String以外的所有复合数据类型,包括数 ...

  8. 阿里巴巴Java“代码反潜机”P3C喜提首届中国优秀开源项目二等奖!

    12 月 12-14 日,由中国开源云联盟.中国电子技术标准化研究院和全国信标委云计算标准工作组主办的第八届中国云计算标准和应用大会在京举行. 聚焦企业上云和开源,大会公布了首届中国优秀开源项目的名单 ...

  9. 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...

最新文章

  1. EntityFramework 基础提供程序在 Open 上失败。
  2. 如何开发auto complete 智能提示功能
  3. 133.保护频带 134.流量控制在哪些层实现
  4. StringBuider 在什么条件下使用效率更高?
  5. 第九章 思科竞争谋略
  6. mac 上安装服务,查看服务,重启和关闭
  7. 设计模式之facade模式
  8. 再来一波PHP程序员必看书籍
  9. 现代的缓存设计方案:Window-TinyLFU
  10. python迭代法求平方根_1021: 迭代法求平方根
  11. 2021福州地区高考成绩排名查询,2021年福州各高中高考成绩排名及放榜最新消息...
  12. CentOS 7下使用chkconfig添加的服务无法使用/etc/profile里面的环境变量
  13. AJax错误WebForm1没有定义的javascript错误的解决方法
  14. Gram matrix(格拉姆矩阵)
  15. idea 包存在提示不存在
  16. C语言图书管理信息系统
  17. 菜鸟的spring security学习教程
  18. Mysql增删改查(CURD)
  19. 模拟器什么的都过时了!这样玩吃鸡才能真正的高清无延迟
  20. neogeo模拟器 linux,neogeo模拟器

热门文章

  1. MFC中将CBitmap画到cdc上
  2. C++ socket编程 实现服务端与客户端的通讯
  3. java actor和线程有什么区别_Scala Actor与java并发编程的区别
  4. 替换html标签内容正则表达式,正则表达式,替换所有HTML标签的简单实例
  5. java c 语言之父_Java之父评价C语言之父:他是一位天才,c语言撑起了一切
  6. 框架鲜花商城系统测试_分销、团购、秒杀、优惠券小程序商城源码免费分享(Java语言)...
  7. 如何展示富文本_自助建站如何做出个性化效果?
  8. “您的Microsoft Internet Explorer浏览器包含最新版本的内置Adobe Flash Player“解决
  9. Connect to dl.google.com:443 [dl.google.com/142.250.66.142] failed: Connection timed out:
  10. Android开发之自定义view预览不显示的问题