DECLARE_META_INTERFACE(INTERFACE)和IMPLEMENT_META_INTERFACE(INTERFACE, NAME)宏定义分析
来源:互联网 发布:淘宝南极人袜子怎么样 编辑:程序博客网 时间:2024/06/16 22:01
这里讲的两个宏定义是IPC中鼎鼎大名的DECLARE_META_INTERFACE(INTERFACE)IMPLEMENT_META_INTERFACE(INTERFACE, NAME)定义
frameworks\base\include\utils\IInterface.h
定义
frameworks\base\include\utils\IInterface.h
#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; \
}
说明:其中的I##INTERFACE,##表示连接两个宏定义,在这里INTERFACE是模板名,被当作是宏定义。如果INTERFACE是ServiceManager那么I##INTERFACE就是IServiceManager。
使用:例子ICameraService
定义声明的宏定义:DECLARE_META_INTERFACE(INTERFACE)
ICameraService.h [frameworks\base\include\ui]
class ICameraService : public IInterface
{
public:
enum {
CONNECT = IBinder::FIRST_CALL_TRANSACTION,
};
public:
DECLARE_META_INTERFACE(CameraService);
virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient) = 0;
};
把这句展开就是:
static const String16 descriptor; \
static sp<ICameraService > asInterface(const sp<IBinder>& obj); \
virtual String16 getInterfaceDescriptor() const;
就是说在ICameraService接口类中定义了一个String16的变量和两个函数。
然后在ICameraService.cpp [frameworks\base\libs\ui]中定义另外一个实现的宏定义。
就这么一句:
IMPLEMENT_META_INTERFACE(CameraService, "android.hardware.ICameraService");
展开为:
const String16 ICameraService::descriptor("android.hardware.ICameraService"); \
String16 ICameraService::getInterfaceDescriptor() const { \
return ICameraService::descriptor; \
} \
sp<ICameraService > ICameraService::asInterface(const sp<IBinder>& obj) \
{ \
sp<ICameraService > intr; \
if (obj != NULL) { \
intr = static_cast<ICameraService *>( \
obj->queryLocalInterface( \
ICameraService::descriptor).get()); \
if (intr == NULL) { \
intr = new BpCameraService (obj); \
} \
} \
return intr; \
}
展开就是说初始化了一个变量descriptor,实现了BpCameraService类的2个函数:getInterfaceDescriptor (), asInterface()。而且这个宏定义不属于在这个cpp文件中定义的BpCameraService类和在.h文件中定义的BnCameraService类。
在Camera.cpp [frameworks\base\libs\ui]中
const sp& Camera::getCameraService()函数调用
mCameraService = interface_cast(binder);
著名的interface_cast函数
template<typename INTERFACE>
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
{
return INTERFACE::asInterface(obj);
}
interface_cast调用的是宏定义中的asInterface函数,然后返回的是new BpCameraService (obj)对象。
- DECLARE_META_INTERFACE(INTERFACE)和IMPLEMENT_META_INTERFACE(INTERFACE, NAME)宏定义分析
- interface宏:DECLARE_META_INTERFACE/IMPLEMENT_META_INTERFACE
- Network Interface name change
- 3G网络Entity和Interface定义总结
- Interface
- interface
- interface
- interface
- interface
- interface
- @interface
- Interface
- @interface
- Interface
- interface
- Interface
- interface
- Interface
- Mac word文档异常退出如何恢复
- 错误代码: SEC_ERROR_REUSED_ISSUER_AND_SERIAL(解决办法)
- MongoDB 内嵌文档
- 线程基础:多任务处理(12)——Fork/Join框架(基本使用)
- gmapping源码分析以及收获
- DECLARE_META_INTERFACE(INTERFACE)和IMPLEMENT_META_INTERFACE(INTERFACE, NAME)宏定义分析
- PLC实验五(LED数码管显示控制)
- itellij idea导入web项目并部署到tomcat
- Dijkstra(迪杰斯特拉)算法
- JS学习九----JSON
- Ajax的概述
- MongoDB 文档的更新操作
- 适配器模式
- Android Color(颜色)解析