binder c++ 類

weixin_30902251發表於2015-04-07

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介面作為函式的引數,就可以了。





轉載於:https://www.cnblogs.com/monkeyyuan/p/4397945.html

相關文章