热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DECLARE_META_INTERFACE(INTERFACE)和IMPLEMENT_META_INTERFACE(INTERFACE,NAME)宏定义分析

这里讲的两个宏定义是IPC中鼎鼎大名的DECLARE_META_INTERFACE(INTERFACE)IMPLEMENT_META_INTERFACE(INTERFACE,NAM

DECLARE_META_INTERFACE(INTERFACE)和IMPLEMENT_META_INTERFACE(INTERFACE, NAME)宏定义分析

frameworksaseincludeutilsIInterface.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是模板名,被当作是宏定义。如果INTERFACEServiceManager那么I##INTERFACE就是IServiceManager

使用:例子ICameraService

定义声明的宏定义:DECLARE_META_INTERFACE(INTERFACE)  

ICameraService.h [frameworksaseincludeui]

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 [frameworksaselibsui]中定义另外一个实现的宏定义。

就这么一句:

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 [frameworksaselibsui]

 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)对象。


推荐阅读
author-avatar
史彩哲
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有