mediaplayer在native层的C/S架构关系

一、前言:
本文内容旨在分析native层中mediaplayer是如何获取mediaplayerservice服务的以及他们之间是如何建立联系的,内容前提是建立在你已经知道mediaplayer从java到jni的调用并且熟悉Android中的binder机制。

二、mediaserver的建立:
还是老生常谈的mediaserver的建立:

frameworks\av\media\mediaserver\main_mediaserver.cpp

		...
        sp<ProcessState> proc(ProcessState::self());
        sp<IServiceManager> sm = defaultServiceManager();
        ALOGI("ServiceManager: %p", sm.get());
        AudioFlinger::instantiate();
        MediaPlayerService::instantiate();
        CameraService::instantiate();
        AudioPolicyService::instantiate();
        SoundTriggerHwService::instantiate();
        ...
        registerExtensions();
        ProcessState::self()->startThreadPool();
        IPCThreadState::self()->joinThreadPool();

以上代码摘自文件中的main函数,在Android系统的init.rc启动脚本中,会去执行mediaserver代码,就会运行到这一段,这是binder中service端的典型代码,从代码中可以看到,一共建立了5个服务,xxx::instantiate完成的操作就是将对应的服务添加到service manager中;

三、 mediaplayer绑定服务:
mediaplayer获取mediaserver是从setdatasource开始的:

frameworks\av\media\libmedia\mediaplayer.cpp

上层调用setdatasource播放文件的时候,会分为本地场景和URL场景,这里以本地播放场景为例,贴出代码如下:

status_t MediaPlayer::setDataSource(int fd, int64_t offset, int64_t length)
{
   
    ALO

你可能感兴趣的:(Android媒体)