11/17/2010 [转载]Android的IPC机制,Binder的各个部分_2

来源:互联网 发布:知乎小说推荐知乎言情 编辑:程序博客网 时间:2024/05/23 07:25

http://hi.baidu.com/tang157/item/9d8936ddf61efa52d63aae08


11/17/2010

[转载]Android的IPC机制,Binder的各个部分_2

<!--我在网上找的,不知道原创是谁,所以不好意思了。我写了转载-->

1.3 binder的库的部分
    binder相关的文件作为Android的uitls库的一部分,这个库编译后的名称为libutils.so,是Android系统中的一个公共库。
    主要文件的路径如下所示:
frameworks/base/include/utils/* 
frameworks/base/libs/utils/*

    
    主要的类为:
RefBase.h :
    引用计数,定义类RefBase。
Parcel.h :
    为在IPC中传输的数据定义容器,定义类Parcel
IBinder.h

    Binder对象的抽象接口, 定义类IBinder
Binder.h
    Binder对象的基本功能, 定义类Binder和BpRefBase
BpBinder.h:
BpBinder的功能,定义类BpBinder
IInterface.h
为抽象经过Binder的接口定义通用类,
    定义类IInterface,类模板BnInterface,类模板BpInterface
ProcessState.h
    表示进程状态的类,定义类ProcessState
IPCThreadState.h
    表示IPC线程的状态,定义类IPCThreadState


各个类之间的关系如下所示:

 



    在IInterface.h中定义的BnInterface和BpInterface是两个重要的模版,这是为各种程序中使用的。
BnInterface模版的定义如下所示:
template<typename INTERFACE>
class BnInterface : public INTERFACE, public BBinder
{
public:
virtual sp<IInterface>  queryLocalInterface(const String16& _descriptor);
virtual String16        getInterfaceDescriptor() const;
protected:
virtual IBinder*        onAsBinder();
};
BnInterface模版的定义如下所示:
template<typename INTERFACE>
class BpInterface : public INTERFACE, public BpRefBase
{
public:
BpInterface(const sp<IBinder>& remote);
protected:
virtual IBinder*    onAsBinder();
};
         这两个模版在使用的时候,起到得作用实际上都是双继承:使用者定义一个接口INTERFACE,然后使用BnInterface和BpInterface两个模版结合自己的接口,构建自己的BnXXX和BpXXX两个类。
DECLARE_META_INTERFACE和IMPLEMENT_META_INTERFACE两个宏用于帮助BpXXX类的实现: 
#define DECLARE_META_INTERFACE(INTERFACE)                               \
static const String16 descriptor;                                   \
static sp<I##INTERFACE> asInterface(const sp<IBinder>& 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> I##INTERFACE::asInterface(const sp<IBinder>& obj)  \
{                                                                   \
sp<I##INTERFACE> intr;                                          \
if (obj != NULL) {                                              \
intr = static_cast<I##INTERFACE*>(                          \
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()两个函数。


原创粉丝点击