Java 层的 IBinder 在 native 层的表现:Binder 表现为 JavaBBinder,BinderProxy 表现为 BpBinder。
native层的服务,在远端表现为 BpXXXService(内部持有 BpBinder),服务端表现为 BnXXXService(继承于 BnBinder)
BpBinder BnBinder BpXXXService BnXXXService:
以 MediaPlayerService 相关的为例子;
const sp<IMediaPlayerSerivce>& IMediaDeathNotifier::getMediaPlayerService(){
...
if(sMediaPlayerService == 0){
//得到 BpServiceManager(BpBinder(0))
sp<IServicePlayService> sm = defaultServiceManager();
sp<IBinder> binder;
do{
//得到一个 BpBinder,handle 指向 MediaPlayerService
binder = sm->getService(String16("media.player"));
if(binder != 0){
break;
}
}while(true)
//在 IMediaPlayerService.cpp 实现了宏
//IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");
//展开后得到 sMediaPlayerService 是 BpMediaPlayerService(BpBinder(handle 指向 MediaPlayerService))
sMediaPlayerService = interface_cast<IMediaPlayerService>(binder);
}
}
在其他进程获得的服务是 BpXXXService(BpBinder(handle)),是利用每个服务实现了不同的IMPLEMENT_META_INTERFACE(INTERFACE, name)产生的不同的interface_cast
对于 BnXXXService,是
//MediaPlayerService.h
class MediaPlayerService : public BnMediaPlayerService{
}
与 service manager 的通信的殊途同归
以获得 service manager 的代理来说,java 层调用getIServiceManager()@ServiceManager得到 BinderProxy(),这个 BpBinder 的 mObject 字段保存了 natvie 保存的 BpBinder(0);
native 层调用defaultServiceManager()@IServiceManager.cpp得到BpServiceManager(BpBinder(0));
无论是 java 层还是 native 层,与 service manager 通信的时候都是依靠这个 BpBinder(0)进行 transact。
网友评论