binder c++ 类
Binder
binder作为android中ipc的机制,应用在android的各个地方。包含了三层(java, C++/C , 驱动)。
binder的目的是实现多个进程之间通信,之间传递的数据有基本数据类型,binder类型,这个包装在parcel中。
在c++层使用多个类封装:
主要的类有:
RefBase关于引用计数Parcel这个是传输的数据容器, 还支持######IBinder对象######的引用。IBinderbinder对象接口,里面有transact纯虚函数BpBinderbinder引用对象,存在于BpRefBase中,由binder驱动生成该对象BBinderbinder的实体对象IInterface接口BnInterface模板类,继承了IXX 和BBinderBpInterface模板类, 继承了IXX和BpRefBaseIPCThreadStateProcessState该类生成后,将打开Binder driver。
用C++编写binder应用,要有个客户端代码和服务端代码,我的一个应用, 主要代码有:
客户端
int main(int argc, char** argv){LOGI("binderclient");printf("binderclient --\n");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接口作为函数的参数,就可以了。
浙公网安备 33010602011771号