转载请把头部出处链接和尾部二维码一起转载,本文出自:

http://blog.csdn.net/hejjunlin/article/details/52435789

前面几节中,都是通过java层调用到jni中,jni向下到c++层并未介绍

看下Java层一个方法在c++层 MediaPlayer后续过程

frameworks/av/media/libmedia/MediaPlayer.cpp

找一个我们之前熟悉的setDataResource方法看下C/S模式的过程,亦可参考Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程中的图,了解整体上C/S架构。先看下Agenda:

  • 举例setDataSource方法在mediaplayer.cpp之后发生了什么?
  • Client到底是什么?
  • Client及MediaPlayer是什么一种关系?
  • IMediaPlayer.h,mediaplayer.h,IMediaPlayerClient分别做什么?

举例setDataSource方法在mediaplayer.cpp之后发生了什么?

先看下setDataSource方法:

对应看下MediaPlayerService.cpp中createt函数,这里说下MediaPlayerService.cpp位置,6.0源码中是在frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp中。如下:

在new Client中,有一个IPCThreadState,这里介绍下: 在Android中ProcessState是客户端和服务端公共的部分,作为Binder通信的基础,ProcessState是一个singleton类,每个

进程只有一个对象,这个对象负责打开Binder驱动,建立线程池,让其进程里面的所有线程都能通过Binder通信。

与之相关的是IPCThreadState,每个线程都有一个IPCThreadState实例登记在Linux线程的上下文附属数据中,主要负责

Binder的读取,写入和请求处理框架。IPCThreadState在构造的时候获取进程的ProcessState并记录在自己的成员变量mProcess中,通过mProcess可以获得Binder的句柄。详细了解ProcessStata及IPCThreadState源码,可以参考:《Binder中的ProcessState和IPCThreadState分析》,写的很不错,IPCThreadState通过IPCThreadState::transact把data,及handle等填充入binder_transaction_data,在两个进程间通信。

Client到底是什么?

这里这个Client到底是什么?我们又得追踪下,在frameworks/av/media/libmediaplayerservice/MediaPlayerService.h如下:





以上代码没有省略,是因为确实对我们理解从Java层过来的MediaPlayer相关方法,在这都有对应。如果还记得前面《Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程》文章中那个图的话,可以从整体上理解这个Client属于什么角色及位置。继承BnMediaPlayer,并包含了IMediaPlayer相关接口。

总结下上面代码:Client类的继承关系为:Client->BnMediaPlayer->IMediaPlayer分析上面代码,可以看出create方法,是构造了一个Client对象,并且将此client对象添加到mediapalyerservice类的全局列表中:mClients,是一个SortedVector,紧接着执行player->setDataSource(url, headers),即Clients::setDataSource,因此在setDataSource中的

语句相当于

即player最终是用Client对象来初始化,可以直接认为player==client

本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52435789

Client及MediaPlayer是什么关系?

这是候问题来了?在C++中,这个Client及MediaPlayer又是什么一种关系呢?

  • Client是MediaPlayerService内部的一个类,我们从上面代码已知,因为MediaPlayerService运行在服务端,故Client也是运行在服务端。
  • Client在MediaPlayerService.h中,那接着看下MediaPlayerService中的实现,实现过程中调用过了MediaPlayerService类的一些函数,同样回到setDataSource



接下来看MediaPlayer中,以下代码中在frameworks/av/include/media/mediaplayer.h中:



这里函数和Client中的函数时一一对应的,两者通过Client的代理类联系在了一起。



上面两个函数,一个是MediaPlayer的setDataSouree,然后里面会调到attachNewPlayer函数,这个函数最终会调用到服务端Client的对应的函数,

本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52435789

IMediaPlayer.h,mediaplayer.h,IMediaPlayerClient分别做什么?

到这里,可能有人会想:IMediaPlayer.h,及mediaplayer.h的区别是什么?总结主要如下(另加一个IMediaPlayerClient.h,一起介绍):

  • 从包结构:首先IMediaPlayer和IMediaPlayerClient.h都是在frameworks/av/media/libmedia包下,而mediaplayer.h是在/av/include/media包下。(前面已有代码贴出)
  • 从功能上看:它们担当职责也不一样

这里贴出IMediaPlayer.h及IMediaPlayerClient.h代码:

IMediaPlayer.h位于frameworks/av/media/libmedia下:



IMediaPlayer.h中定义的基本上都是虚函数,而我们知道虚函数在C++中就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。所以它的功能是一个实现MediaPlayer功能的接口,看到那个onTransact方法,自然联想Binder通信,把底层的Parcel指针类型数据向上层向另一个进程中传递。

再看下IMediaPlayerClient.h,同样位于frameworks/av/media/libmedia下:



  • 上面代码总结为:在内部定义一个BpMediaPlayerClient(也就是Client的父类),然后它也有一个onTransact,一般onXXX都是属于背动回调过来的,不是由自己控制,如Activity中onCreate,onPause,onStart,这些都是在其他地方处理,通知到Actvitity中的。这里也是一样,onTransact作为Binder通信中的回调方法,前面《Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程》中介绍到player实际上是C/S模式整体,IMediaPlayerClient.h的功能是描述一个MediaPlayer客户端的接口。

  • 最后总结下:mediaplayer.h的功能是对外(jni层)的接口类,它最主要是定义了一个MediaPlayer类(C++层),我们在android_media_MediaPlayer.cpp中就引入了media/mediaplayer.h,IMediaPlayer.h则是一个实现MediaPlayer(C++层)功能的接口,而IMediaPlayerClient.h的功能是描述一个MediaPlayer客户端(这里暂理解为前面说的Client)的接口。


第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注。

如果你觉得好,随手点赞,也是对笔者的肯定,也可以分享此公众号给你更多的人,原创不易

Android Multimedia框架总结(六)C++中MediaPlayer的C/S架构的更多相关文章

  1. Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52420803 前言:在上篇中,分析了MediaPl ...

  2. Android Multimedia框架总结(三)MediaPlayer中创建到setDataSource过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52392430 前言:前一篇的mediaPlayer ...

  3. Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期

    请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52349221 前言:从本篇开始,将进入Multimedia框架,包含 ...

  4. Android Multimedia框架总结(二)MediaPlayer框架及播放网络视频案例

    前言:前面一篇我们介绍MediaPlayer相关方法,有人说,没有实际例子,看得不是很明白,今天在分析MediaPlayer时,顺带一个播放网络视频例子.可以自行试试.今天分析的都是下几篇介绍各个模块 ...

  5. Android Multimedia框架总结(七)C++中MediaPlayer的C/S架构补充及MediaService介绍

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼,文章链接: http://blog.csdn.net/hejjunlin/article/details/52465168 前面一篇主要介绍 ...

  6. Android Multimedia框架总结(十五)Camera框架之Camera2补充

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52751055 前言:监于5.0之 ...

  7. Android Multimedia框架总结(十一)CodeC部分之AwesomePlayer到OMX服务

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52623882 前言:上篇文< ...

  8. Android Multimedia框架总结(九)Stagefright框架之数据处理及到OMXCodec过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼:http://blog.csdn.net/hejjunlin/article/details/52532085 不知不觉到第九篇了,感觉还有 ...

  9. Android Multimedia框架总结(十三)CodeC部分之OpenMAX框架初识及接口与适配层实现

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52629598 前言:上篇中介绍O ...

随机推荐

  1. Android重构篇——项目架构篇

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6823777.html 前言 大家好,我是Cavalier ...

  2. mysql事务,视图,权限管理,索引,存储引擎(胖胖老师)

    1: 视图什么是视图    视图是一个虚拟表, 它的内容来源于查询的实表, 本身没有真正的数据;视图的作用    对于复杂的查询时,每次查询时都需要编写一些重复的查询代码让编写sql的效率低下, 为了 ...

  3. [SHOI 2008]Debt 循环的债务

    Description 题库链接 A 欠 B \(x_1\) 元, B 欠 C \(x_2\) 元, C 欠 A \(x_3\) 元.现每人手上各有若干张 100,50,20,10,5,1 钞票.问至 ...

  4. [NOIp 2014]联合权值

    Description 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v ...

  5. Go学习——go+channel实战(转)

    转载:http://studygolang.com/articles/2423 背景 在最近开发的项目中,后端需要编写许多提供HTTP接口的API,另外技术选型相对宽松,因此选择Golang + Be ...

  6. 【LSGDOJ1836】: 量化交易 贪心

    题目描述 applepi 训练了一个可以自动在股票市场进行量化交易的模型.通常来说,applepi 写出的模型,你懂得,就好比一架印钞机.不过为了谨慎起见,applepi还是想先检查一下模型的效果.a ...

  7. ●POJ 2125 Destroying The Graph

    题链: http://poj.org/problem?id=2125 题解: 最小割 + 输出割方案.建图:拆点,每个题拆为 i 和 i'分别表示其的入点和出点建立超源 S和超汇 T.S -> ...

  8. ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined)

    前四题比较水,E我看出是欧拉函数傻逼题,但我傻逼不会,百度了下开始学,最后在加时的时候A掉了 AC:ABCDE Rank:182 Rating:2193+34->2227 终于橙了,不知道能待几 ...

  9. 例10-12 *uva1637(概率dp)

    题意:36张扑克,平分成9摞,两张数字一样的可以拿走,每次随机拿两张,问能拿光的概率. 思路: 直接用搜索,表示出每摞剩余的牌数,然后利用全概率公式即可(P(A) = p(A|b1)*p(b1)+.. ...

  10. ⏰Day.js 2kB超轻量时间库 和Moment.js一样的API

    Moment.js 是一个大而全的 JS 时间库,很大地方便了我们处理日期和时间.但是 Moment.js太重了(200k+ with locals),可能一般项目也只使用到了她几个常用的API.虽然 ...