android binder机制实现
2010-05-31 14:30:00 来源:WEB开发网template
class BpInterface : public INTERFACE, public BpRefBase
{
public:
BpInterface(const sp& remote);
protected:
virtual IBinder* onAsBinder();
};
template class BnInterface : public INTERFACE, public BBinder { public: virtual sp queryLocalInterface(const String16& _descriptor); virtual String16 getInterfaceDescriptor() const; protected: virtual IBinder* onAsBinder(); }; BnInterface模版的定义如下所示: template class BpInterface : public INTERFACE, public BpRefBase { public: BpInterface(const sp& remote); protected: virtual IBinder* onAsBinder(); };
这两个模版在使用的时候,起到得作用实际上都是双继承:使用者定义一个接口INTERFACE,然后使用BnInterface和BpInterface两个模版结合自己的接口,构建自己的BnXXX和BpXXX两个类。
DECLARE_META_INTERFACE和IMPLEMENT_META_INTERFACE两个宏用于帮助BpXXX类的实现:
Java代码 < width="14" height="15" src="http://mintelong.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" pluginspage="http://www.macromedia.com/go/getflashplayer">
#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;
更多精彩
赞助商链接