binder c++ 类

Binder

binder作为android中ipc的机制,应用在android的各个地方。包含了三层(java, C++/C , 驱动)。
binder的目的是实现多个进程之间通信,之间传递的数据有基本数据类型,binder类型,这个包装在parcel中。
在c++层使用多个类封装:
技术分享

主要的类有:

  1. RefBase 关于引用计数
  2. Parcel 这个是传输的数据容器, 还支持######IBinder对象######的引用。
  3. IBinder binder对象接口,里面有transact 纯虚函数
  4. BpBinder binder引用对象,存在于BpRefBase中,由binder驱动生成该对象
  5. BBinder binder的实体对象
  6. IInterface 接口
  7. BnInterface 模板类,继承了IXX 和BBinder
  8. BpInterface 模板类, 继承了IXX和BpRefBase
  9. IPCThreadState
  10. ProcessState 该类生成后,将打开Binder driver。

用C++编写binder应用,要有个客户端代码和服务端代码,我的一个应用, 主要代码有:

客户端
  1. int main(int argc, char** argv)
  2. {
  3. LOGI("binderclient");
  4. printf("binderclient --\n");
  5. int sum = 0;
  6. sp mTestBinserService;
  7. if (mTestBinserService.get() == 0) {
  8. sp sm = defaultServiceManager();
  9. sp binder;
  10. do {
  11. binder = sm->getService(String16("my.test.binder"));
  12. if (binder != 0)
  13. break;
  14. LOGI("getService fail");
  15. usleep(500000); // 0.5 s
  16. } while (true);
  17. mTestBinserService = interface_cast (binder);
  18. LOGE_IF(mTestBinserService == 0, "no ITestBinserService!?");
  19. }
  20. sum = mTestBinserService->add(3, 4);
  21. LOGI("sum = %d", sum);
  22. return 0;
  23. }
服务端
  1. int main(int argc, char** argv)
  2. {
  3. sp proc(ProcessState::self());
  4. sp sm = defaultServiceManager();
  5. LOGI("TestBinderService before");
  6. //TestBinderService::instantiate();
  7. sm->addService(String16("my.test.binder", new TestBinderService());//TestBinderService继承于B你Interface, 也就是继承于ITestBinderService和BBinder.
  8. LOGI("TestBinderService End");
  9. ProcessState::self()->startThreadPool();
  10. IPCThreadState::self()->joinThreadPool();
  11. LOGI("TestBinderService End");
  12. return 0;
  13. }

进程间的回调

使用binder可以实现进程之间的回调。Ibinder接口作为函数的参数,就可以了。





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。