Binder
binder作为android中ipc的机制,应用在android的各个地方。包含了三层(java, C++/C , 驱动)。
binder的目的是实现多个进程之间通信,之间传递的数据有基本数据类型,binder类型,这个包装在parcel中。
在c++层使用多个类封装:
主要的类有:
RefBase
关于引用计数Parcel
这个是传输的数据容器, 还支持######IBinder对象######的引用。IBinder
binder对象接口,里面有transact
纯虚函数BpBinder
binder引用对象,存在于BpRefBase
中,由binder驱动生成该对象BBinder
binder的实体对象IInterface
接口BnInterface
模板类,继承了IXX 和BBinderBpInterface
模板类, 继承了IXX和BpRefBaseIPCThreadState
ProcessState
该类生成后,将打开Binder driver。
用C++编写binder应用,要有个客户端代码和服务端代码,我的一个应用, 主要代码有:
客户端
int main(int argc, char** argv)
{
LOGI("binderclient");
printf("binderclient -- ");
int sum = 0;
sp mTestBinserService;
if (mTestBinserService.get() == 0) {
sp sm = defaultServiceManager();
sp binder;
do {
binder = sm->getService(String16("my.test.binder"));
if (binder != 0)
break;
LOGI("getService fail");
usleep(500000); // 0.5 s
} while (true);
mTestBinserService = interface_cast (binder);
LOGE_IF(mTestBinserService == 0, "no ITestBinserService!?");
}
sum = mTestBinserService->add(3, 4);
LOGI("sum = %d", sum);
return 0;
}
服务端
int main(int argc, char** argv)
{
sp proc(ProcessState::self());
sp sm = defaultServiceManager();
LOGI("TestBinderService before");
//TestBinderService::instantiate();
sm->addService(String16("my.test.binder", new TestBinderService());//TestBinderService继承于B你Interface, 也就是继承于ITestBinderService和BBinder.
LOGI("TestBinderService End");
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
LOGI("TestBinderService End");
return 0;
}
进程间的回调
使用binder可以实现进程之间的回调。Ibinder接口作为函数的参数,就可以了。