android binder机制实现
2010-05-31 14:30:00 来源:WEB开发网}
#define DECLARE_META_INTERFACE(INTERFACE) static const String16 descriptor; static sp asInterface(const sp& obj); virtual String16 getInterfaceDescriptor() const; #define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) const String16 I##INTERFACE::descriptor(NAME); String16 I##INTERFACE::getInterfaceDescriptor() const { return I##INTERFACE::descriptor; } sp I##INTERFACE::asInterface(const sp& obj) { sp intr; if (obj != NULL) { intr = static_cast( obj->queryLocalInterface( I##INTERFACE::descriptor).get()); if (intr == NULL) { intr = new Bp##INTERFACE(obj); } } return intr; }
在定义自己的类的时候,只需要使用DECLARE_META_INTERFACE和IMPLEMENT_META_INTERFACE两个接口,并
结合类的名称,就可以实现BpInterface中的asInterface()和getInterfaceDescriptor()两个函数。
第二部分 Binder的运作
2.1 Binder的工作机制
Service Manager是一个守护进程,它负责启动各个进程之间的服务,对于相关的两个需要通讯的进程,它们通过调用libutil.so库实现通讯,而真正通讯的机制,是内核空间中的一块共享内存。
2.2 从应 用程序的角度看Binder
从应用程序的角度看Binder一共有三个方面:
Native 本地:例如BnABC,这是一个需要被继承和实现的类。
Proxy 代理:例如BpABC,这是一个在接口框架中被实现,但是在接口中没有体现的类。
客户端:例如客户端得到一个接口ABC,在调用的时候实际上被调用的是BpABC
本地功能(Bn)部分做的:
实现BnABC:: BnTransact()
注册服务:IServiceManager::AddService
代理部分(Bp)做的:
实现几个功能函数,调用BpABC::remote()->transact()
更多精彩
赞助商链接