mediaplyer client and server 的关联机制和Binder使用:
1、启动mediaserver进程(mips-ics\frameworks\base\media\mediaserver\main_mediaserver.cpp)
int main(int argc, char** argv)
{
sp proc(ProcessState::self());
sp sm = defaultServiceManager();\*获取service manager*\
MediaPlayerService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();//将自己加入到线程池
}
void MediaPlayerService::instantiate() {
defaultServiceManager()->addService(
String16("media.player"), new MediaPlayerService());
}
addService( const String16& name, const sp& service)
2.mediaplyer client获取服务:
const sp& IMediaDeathNotifier::getMediaPlayerService()
{
sp sm = defaultServiceManager();
sp binder;
binder = sm->getService(String16("media.player"));
sMediaPlayerService = interface_cast<IMediaPlayerService>(binder);
将基类binder指向MediaplayerService的对外接口IMediaPlayerService
}
3.libMedia_Jni (android_media_MediaPlayer.cpp)
static JNINativeMethod gMethods[] = {
{"setDataSource", "(Ljava/lang/String;)V", (void *)android_media_MediaPlayer_setDataSource},
{"prepare", "()V", (void *)android_media_MediaPlayer_prepare},
{"_start", "()V", (void *)android_media_MediaPlayer_start},
{"_stop", "()V", (void *)android_media_MediaPlayer_stop},};
4.Mediaplayer Java API: (MediaPlayer.java)
{
static {
System.loadLibrary("media_jni");
native_init();}
三、Mediaplayer实例
1、 Java 代码
mMediaPlayer = new MediaPlayer();
mMediaPlayer .setDataSource(uri)
2、 C++ 代码
1. Client Java code.
android_media_MediaPlayer_native_setup()
{
sp mp = new MediaPlayer();
// create new listener and give it to MediaPlayer
sp listener = new JNIMediaPlayerListener(env, thiz, weak_this);
mp->setListener(listener);
}
2. Client C++ code
android_media_MediaPlayer_setDataSource()
{
sp mp = getMediaPlayer(env, thiz);
mp->setDataSource();
}
MediaPlayer::setDataSource()
{
const sp& service(getMediaPlayerService());
sp<IMediaPlayer> player(service->create(getpid(), this, mAudioSessionId));
player->setDataSource(url, headers)) ;
attachNewPlayer(player);
}
3. Server C++ code.
sp<IMediaPlayer> MediaPlayerService::create()
{
sp c = new MediaPlayerService ::Client();
Return c;
}
MediaPlayerService::Client::setDataSource()
{
player_type playerType = getPlayerType(url);
sp p = createPlayer(playerType);
mStatus = p->setDataSource(url, headers);
}