宏的使用方式
Posted 鸭子船长
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了宏的使用方式相关的知识,希望对你有一定的参考价值。
下面举例记录宏的一种使用方式。
##name 用来在宏定义中传递名称变量。
由于宏定义仅直接插入调用处,可以用来进行函数声明
4.1 interface_cast
[-> IInterface.h]
1 template<typename INTERFACE> 2 inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj) 3 { 4 return INTERFACE::asInterface(obj); //【见小节4.2】 5 }
这是一个模板函数,可得出,interface_cast<IServiceManager>()
等价于 IServiceManager::asInterface()
。接下来,再来说说asInterface()
函数的具体功能。
4.2 IServiceManager::asInterface
对于asInterface()函数,通过搜索代码,你会发现根本找不到这个方法是在哪里定义这个函数的, 其实是通过模板函数来定义的,通过下面两个代码完成的:
1 //位于IServiceManager.h文件 【见小节4.3】 2 DECLARE_META_INTERFACE(ServiceManager) 3 //位于IServiceManager.cpp文件 【见小节4.4】 4 IMPLEMENT_META_INTERFACE(ServiceManager,"android.os.IServiceManager")
接下来,再说说这两行代码分别完成的功能:
4.3 DECLARE_META_INTERFACE
[-> IInterface.h]
1 #define DECLARE_META_INTERFACE(INTERFACE) 2 static const android::String16 descriptor; 3 static android::sp<I##INTERFACE> asInterface( 4 const android::sp<android::IBinder>& obj); 5 virtual const android::String16& getInterfaceDescriptor() const; 6 I##INTERFACE(); 7 virtual ~I##INTERFACE(); \
位于IServiceManager.h文件中,INTERFACE=ServiceManager展开即可得:
[-> IServiceManager.h]
1 static const android::String16 descriptor; 2 3 static android::sp< IServiceManager > asInterface(const android::sp<android::IBinder>& obj) 4 5 virtual const android::String16& getInterfaceDescriptor() const; 6 7 IServiceManager (); 8 virtual ~IServiceManager();
该过程主要是声明asInterface()
,getInterfaceDescriptor()
方法.
4.4 IMPLEMENT_META_INTERFACE
[-> IInterface.h]
1 #define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) 2 const android::String16 I##INTERFACE::descriptor(NAME); 3 const android::String16& 4 I##INTERFACE::getInterfaceDescriptor() const { 5 return I##INTERFACE::descriptor; 6 } 7 android::sp<I##INTERFACE> I##INTERFACE::asInterface( 8 const android::sp<android::IBinder>& obj) 9 { 10 android::sp<I##INTERFACE> intr; 11 if (obj != NULL) { 12 intr = static_cast<I##INTERFACE*>( 13 obj->queryLocalInterface( 14 I##INTERFACE::descriptor).get()); 15 if (intr == NULL) { 16 intr = new Bp##INTERFACE(obj); 17 } 18 } 19 return intr; 20 } 21 I##INTERFACE::I##INTERFACE() { } 22 I##INTERFACE::~I##INTERFACE() { } \
位于IServiceManager.cpp文件中,INTERFACE=ServiceManager, NAME=”android.os.IServiceManager”展开即可得:
[-> IServiceManager.cpp]
1 const android::String16 IServiceManager::descriptor(“android.os.IServiceManager”); 2 3 const android::String16& IServiceManager::getInterfaceDescriptor() const 4 { 5 return IServiceManager::descriptor; 6 } 7 8 android::sp<IServiceManager> IServiceManager::asInterface(const android::sp<android::IBinder>& obj) 9 { 10 android::sp<IServiceManager> intr; 11 if(obj != NULL) { 12 intr = static_cast<IServiceManager *>( 13 obj->queryLocalInterface(IServiceManager::descriptor).get()); 14 if (intr == NULL) { 15 intr = new BpServiceManager(obj); //【见小节4.5】 16 } 17 } 18 return intr; 19 } 20 21 IServiceManager::IServiceManager () { } 22 IServiceManager::~ IServiceManager() { }
不难发现,[小节4.2]的IServiceManager::asInterface()
等价于 new BpServiceManager()
。在这里,更确切地说应该是new BpServiceManager(BpBinder)。
5.1
Native层的Binder架构,通过如下两个宏,非常方便地创建了new Bp##INTERFACE(obj)
:
1 //用于申明asInterface(),getInterfaceDescriptor() 2 #define DECLARE_META_INTERFACE(INTERFACE) 3 #define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) //用于实现上述两个方法
例如:
1 // 实现BPServiceManager对象 2 IMPLEMENT_META_INTERFACE(ServiceManager,"android.os.IServiceManager")
等价于:
1 const android::String16 IServiceManager::descriptor(“android.os.IServiceManager”); 2 const android::String16& IServiceManager::getInterfaceDescriptor() const 3 { 4 return IServiceManager::descriptor; 5 } 6 7 android::sp<IServiceManager> IServiceManager::asInterface(const android::sp<android::IBinder>& obj) 8 { 9 android::sp<IServiceManager> intr; 10 if(obj != NULL) { 11 intr = static_cast<IServiceManager *>( 12 obj->queryLocalInterface(IServiceManager::descriptor).get()); 13 if (intr == NULL) { 14 intr = new BpServiceManager(obj); 15 } 16 } 17 return intr; 18 } 19 20 IServiceManager::IServiceManager () { } 21 IServiceManager::~ IServiceManager() { }
以上是关于宏的使用方式的主要内容,如果未能解决你的问题,请参考以下文章