前面介绍了Android jni 相关知识,但jni最终还是要调用的第三方的C/C++库,这里我们以ffmpeg为例,介绍第三方C/C++如何编译成android 版本。

一、基本原理

关于Android平台C/C++代码编译的方法:

  1. 自己开发的C/C++代码,直接在android studio开发和编译,与jni代码操作方法一致,jni本质就是C/C++代码,只不过调用关于jni的特殊函数,遵守JNI的某些规范而已。
  2. 第三代码。对应第三方代码,直接拷贝到 android studio 开发不太现实,因为这些第三方代码可能非常庞大,而且依赖很多其他库,其他库又依赖其他库,最通用的解决的方案是利用Android NDK的工具链进行交叉编译。

交叉编译:在宿主机上编译,在目标机上执行。从事嵌入式系统或者单片机朋友再熟悉不过了。所有的嵌入系统都是在PC机上编译(宿主机),在单板上执行(目标机)。而Android系统的手机,平板,电视等本身就是一个带Linux内核的嵌入系统。所以我们在Linux PC机上利用Android NDK的工具链编译C/C++代码生成一个so供jni调用就显得更通用更自然的做法。

二、认识Android的交叉工具链

交叉工具链

这个是一个经典的交叉工具链,bin目录是二进制工具。包含常用Android支持的各硬件平台的编译器,链接器,readelf,nm,skip,ar,objectdump,ldd等。

二进制工具

值得关注的Android NDK里面编译器,不再是传统的gcc,g++编译器,考虑编译效率,ndk已经将编译器切换到clang,clang++编译器。sysroot是一个交叉工具链的典型根文件系统,它包括编译所引用的头文件,库(C/C++库,其他函数库等)。

工具链中的头文件与库文件

由此可见,ndk编译Android的 so库本质就是使用交叉工具链交叉编译,与常规的嵌入系统开发流程没有啥区别。

三、编译基于andorid的ffmepg的库

准备unix环境(Linux系统,mac系统,cygwin等),本文编译环境为linux 系统。

1、下载Linux版本的Android NDK

下载地址:https://developer.android.google.cn/ndk/downloads

2、下载ffmpeg

下载地址:http://www.ffmpeg.org/download.html

3、编写编译脚本

编译脚本的基本思路:配置交叉编译相关的变量,在configure生成makefile时指定交叉编译工具链来编译,而不是默认采用宿主机的自带的gcc来编译(如不是自动configure生成的makefile,可以直接修改makefile的工具链来编译)。我们可以将配置和编译写成一个ffmpeg_build.sh脚本。

4、进入ffmpeg根目录采用ffmpeg_build.sh编译即可

chmod +x ffmpeg_build.sh  //修改可执行权限

./ ffmpeg_build.sh     //执行编译

5、生成的android 版本的so库如下:

交叉编译生成的ffmpeg库

四、总结

以上就是关于交叉编译ffmpeg生成Android C/C++的so库的完整步骤,更多更新信息请关注微信公众号:AV_Chat

基于Android平台的ffmpeg编译相关推荐

  1. 使用NDK20编译Android平台的ffmpeg

    使用NDK编译Android平台的ffmpeg 编译环境 安装 编译 避坑 如何添加h264支持 编译环境 注意选择Linux版本的包下载 Ubuntu 16 下载 ndk20 下载 ffmpeg4. ...

  2. 基于NDK编译Android平台的FFmpeg动态库

    需求 FFmpeg在Linux平台(如Ubuntu)上的支持已经比较完善了,如前述文章介绍 http://blog.csdn.net/ericbar/article/details/73702061, ...

  3. 基于Android平台的流媒体播放器的设计

    from: 基于Android平台的流媒体播放器的设计 1引 言 随着移动通信技术和多媒体技术的迅速发展,融合手机.网络.多媒体技术为一体的视频监控技术也有了长足的进步,通过移动通信网络提供流媒体服务 ...

  4. YUVPlayer: 基于Android平台的YUV视频原始数据播放器

    基于Android平台的YUV视频原始数据播放器 编译环境 FFmpeg版本: 4.2.2 NDK版本:r17c 运行环境 x86(模拟器) arm64-v8a(64位手机) 功能点 从文件中读取YU ...

  5. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

    作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...

  6. android app攻击与防范论文,基于Android平台的应用程序安全保护研究与应用

    摘要: 随着Android操作系统的广泛使用和移动互联网时代的到来,Android系统的安全问题也不断出现,给用户和开发者造成了许多困扰.Android应用程序面临着知识产权被侵犯.被二次打包.应用程 ...

  7. 基于android平台的语音机器人服务娱乐系统

    分 类 号:TP311 学校代码:11460 学 号:10130920 本科生毕业论文 基于android平台的语音机器人服务娱乐系统 Robot Entertainment Service Syst ...

  8. android手势识别国内外研究现状,基于Android平台的视觉手势识别研究

    摘要: 本文研究基于Android平台的视觉手势检测.手势分割和识别技术,实现了在Android平台上对规定的六种静态手势的识别,为Android平台的人机交互应用提供了新的技术手段. 首先,本文采用 ...

  9. android 流播放器开发,GitHub - youcoding98/FastVideo: 基于Android平台的移动流媒体播放器的开发...

    基于Android平台的移动流媒体播放器的开发 主页界面如下 第一部分 课题相关介绍 与普通播放器相比,流媒体播放器最主要的不同点在于其能够实现实时的视频播放,用户可以实现边加载边播放,不需要一次全下 ...

最新文章

  1. Reg Infomation
  2. 计算机中位运算的一些性质与技巧
  3. linux rpm mysql mysql_config,Linux CentOS6 mysql rpm安装
  4. php no route to host,java.net.NoRouteToHostException: No route to host解决方法
  5. python中如何调用类takes no arguments_关于python中的 take no arguments 的解决方法
  6. VS各种工程文件说明
  7. Excel中的变量 「 Ctrl + F3 」 查看
  8. 如何打造领英朋友圈_领英点赞,请摆好姿势!
  9. python学习 数据类型之序列
  10. php sockets有什么用,PHP中Sockets与流有什么关系啊!!!!!
  11. 【VC++类型转换】CString和System::String类型的转换
  12. C语言volatile关键字
  13. win7 蓝牙4.0 ble驱动_Android FrameWorkamp;HAL视频最新进度: 蓝牙更新6节(更新时间2019年3月27日)...
  14. 矩阵快速幂 斐波那契数列
  15. Windows系统备份
  16. 微信公众号如何推广自己的小程序以及操作步骤
  17. 一款专为APP设计的后台管理系统平台
  18. 系统,工具,源码,语言组成的数字世界-2021-
  19. 如何将docx文本转换成使用微信小程序rich-text能编译的格式
  20. 内分泌6项检查费用_内分泌6项检查费用是多少 详解内分泌6项检查是什么

热门文章

  1. 联想笔记本打开野兽模式
  2. AirDisk产品Q3C和T2硬盘不认的时候,一般就三种原因
  3. ARM V8 base instruction -- lse
  4. 牛顿-莱布尼茨公式练习习题
  5. 考研英语作文 万能的开头结尾
  6. 【androidstudio】悬浮按钮,悬浮在右侧中间
  7. Vue3 之 Pinia - 状态管理
  8. “世界那么大,我想去看看” ——10款精美的旅游网站设计欣赏
  9. matlab 线性系统响应,MATLAB线性系统时域响应分析实验
  10. 米思奇继电器控制风扇