• 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 -- ");
    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接口作为函数的参数,就可以了。





  • 相关阅读:
    flask项目--认证方案Json Web Token(JWT)
    分布式设计-集群
    分布式设计-哨兵
    分布式设计--数据库主从
    leetcode 221 Maximal Square
    LeetCode222 Count Complete Tree Nodes
    在windows 、linux下读取目录下所有文件名
    leetcode 229 Majority Element II
    leetcode 233 Number of Digit One
    leetcode 238 Product of Array Except Self
  • 原文地址:https://www.cnblogs.com/monkeyyuan/p/4397945.html
Copyright © 2020-2023  润新知