interface_cast<ICameraService>(binder) : 其中binder 爲IBinder類型,實際爲BpBinder
interface_cast 定義在IInterface.h文件中,以下:
聲明以下:android
#define DECLARE_META_INTERFACE(INTERFACE) \
static const android::String16 descriptor; \
static android::sp<I##INTERFACE> asInterface( \
const android::sp<android::IBinder>& obj); \
virtual const android::String16& getInterfaceDescriptor() const; \
I##INTERFACE(); \
virtual ~I##INTERFACE(); \this
定義以下:spa
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \
android::sp<I##INTERFACE> I##INTERFACE::asInterface( \
const android::sp<android::IBinder>& obj) \
{ \
android::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; \
} \
code
見代碼:intr = new Bp##INTERFACE(obj), 這裏INTERFACE爲ICameraService, 即new BpCameraService(obj);對象
frameworks/av/camera/ICameraService.h 中BpCameraService的定義blog
BpCameraService(const sp<IBinder>& impl)
: BpInterface<ICameraService>(impl)
{
}繼承
BpInterface(impl), 將BpBinder傳遞給了BpInterface, 再看:ip
frameworks/native/include/IInterface.h 中BpInterface的實現(這裏實現也放在頭文件了)rem
template<typename INTERFACE>
inline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote)
: BpRefBase(remote)
{
}get
BpRefBase(remote),將BpBinder 又傳遞給了BpRefBase中,繼續跟進
frameworks/native/libs/binder/Binder.cpp 中看BpRefBase的實現
BpRefBase::BpRefBase(const sp<IBinder>& o)
: mRemote(o.get()), mRefs(NULL), mState(0)
{
extendObjectLifetime(OBJECT_LIFETIME_WEAK);
if (mRemote) {
mRemote->incStrong(this); // Removed on first IncStrong().
mRefs = mRemote->createWeak(this); // Held for our entire lifetime.
}
}
mRemote(o.get()), 這裏將BpBinder 保存在了BpRefBase中的變量mRemote中
又有BpCameraService 繼承 BpInterface 繼承 BpRefBase 繼承 RefBase,因此 interface_cast 其實是建立了一個BpCameraService對象,而且將BpBinder複製給它的祖先類