这里讲的两个宏定义是IPC中鼎鼎大名的

DECLARE_META_INTERFACE(INTERFACE)

IMPLEMENT_META_INTERFACE(INTERFACE, NAME)

定义

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)宏定义分析相关推荐

  1. container_of宏定义分析---linux内核

    问题:如何通过结构中的某个变量获取结构本身的指针??? 关于container_of宏定义在[include/linux/kernel.h]中: /*_* * container_of - cast ...

  2. c语言中宏调用比函数调用,C语言-宏定义与使用分析

    1.C语言中的宏定义 #define是预处理器处理的单元实体之- #define定义的宏可以出现在程序的任意位置 #define定义之后的代码都可以使用这个宏 2.定义宏常量 #define定义的宏常 ...

  3. pythonmainoffset_宏offsetof分析

    1.前言 在C语言的结构体中,由于字节对齐的问题,所以成员的地址并不能直接根据数据类型的大小进行计算,使用宏offsetof可以获得结构体成员相对于结构体首地址的字节偏移量. 2.offsetof宏实 ...

  4. __FUNCTION__, __LINE__ 有助于debug的宏定义

    __FUNCTION__, __LINE__ 今天无意之间看到一段代码,里面有这样一个片段: if (!interface) {err ("%s - error, can't find de ...

  5. Obective-C之宏定义

    优(dan)美(teng)的前奏 宏定义这个东东,估计大家在代码中应该天天用吧. 在我刚刚做的一个项目中,各种往代码里码"#define"这种预处理指令. 什么动画时长啊,cell ...

  6. STM32: startup_**.s、Core_cm3.c、宏定义、HAL库

    .s 启动文件选择 给STM32写程序时,我们需要在工程文件中加入厂家提供的启动文件(这里以STMf10x系列为例),里面包含的是启动代码,启动代码是一段和硬件相关的汇编代码.是必不可少的!这代码主要 ...

  7. Flutter iOS问题记录 - 多环境配置下Pod库的宏定义失效

    文章目录 前言 开发环境 问题描述 问题分析 1. 创建用于测试的Pod库 2. 验证问题是否只存在于Pod库 3. __OPTIMIZE__在什么时候会定义 4. 影响__OPTIMIZE__定义的 ...

  8. iOS - 常用宏定义和PCH文件知识点整理

    (一)PCH文件操作步骤演示: 第一步:图文所示: 第二步:图文所示: (二)常用宏定义整理: (1)常用Log日志宏(输出日志详细可定位某个类.某个函数.某一行) //=============== ...

  9. Object-C之宏定义

    优(dan)美(teng)的前奏 宏定义这个东东,估计大家在代码中应该天天用吧. 在我刚刚做的一个项目中,各种往代码里码"#define"这种预处理指令. 什么动画时长啊,cell ...

最新文章

  1. wpf scrollviewer 两个事件相互影响_WPF绘制3D效果显示密集立体集装箱
  2. cloudstack centOS安装(一)
  3. 括号,逻辑与,逻辑或--运算符重载
  4. mlx rdma网卡指标参数简介
  5. 深度学习之非极大值抑制(Non-maximum suppression,NMS)
  6. jsp内置对象--application
  7. mysql 5.1版本无innodb trx_MySQL 5.7: Innodb 事务子系统优化-阿里云开发者社区
  8. java图片特效轮播代码_JQuery实现图片轮播效果
  9. oracle的class12驱动没有实现jdbc对clob或blob的存储, 解决办法
  10. 数据--第30课 - 树的定义
  11. PHPExcel存放多个sheet报错: Invalid parameters passed.
  12. 前端所有安全问题总结
  13. Oracle11g客户端client的下载与安装
  14. JAVA百度贴吧签到器
  15. DevExpress Office File API v20.1新版亮点:增强PDF Document API
  16. 抽象类和接口的小程序
  17. ABAQUS中的文件类型及功能
  18. 算法学习之——矩形切割思想
  19. 【SAP-SD】史上最全的SAP凭证类型总结
  20. python股票成交量柱状图_成交量柱状图怎样判断股票行情

热门文章

  1. 笔试题--Multicore简答题(上)
  2. redis 分布式中间件设计分析
  3. mybatis数据库连接池介绍和源码剖析
  4. VBA 提取 Office 2016 工具栏图标
  5. 12个强大的Web服务测试工具
  6. python面向对象实验报告_20192310 实验三《Python程序设计》实验报告
  7. python按条件拆分列表元素_Python按多个元素和条件拆分列表
  8. [微信小程序] js变量名称写活
  9. 今天写了个商品采购入得存储过程,使用游标实现的,实现了多个商品库存的增加...
  10. Android开发如何去除标题栏title(转)