共同点 :
1. 其实三者都是同一个东西,AHardwareBuffer、ANativeWindowBuffer都是GraphicBuffer通过类型转换而来。
联系
1. GraphicBuffer 继承了ANativeWindowBuffer,所以可以直接通过static_cast<>类型转换成ANativeWindowBuffer,不过由于是多继承,所以转完有一个地址偏移(static_cast 自动完成),
偏移量为0x10(64位场景)大小,为GraphicBuffer父类对象RefBase大小(包括虚函数表指针8字节,成员变量 weakref_impl* const mRefs 8字节)
多继承、带虚函数的偏移,可以参考
https://joydig.com/cpp-base-pointer-offset-adjustment-for-multiple-inheritance/
2. AHardwareBuffer只是一个抽象的概念,没有具体类型,与GraphicBuffer 没有任何继承关系,所以只能通过reinterpret_cast 强制类型转换而来。
区别:
1. AHardwareBuffer 没有具体的类型,是个空结构体,类似于void 类型,aosp封装的那些AHardWareBuffer_XXX接口https://developer.android.com/ndk/reference/group/a-hardware-buffer,其实底层都是把AHardwareBuffer转回成 GraphicBuffer,再去调GraphicBuffer接口。
2. 关于地址: AHardwareBuffer 与GraphicBuffer相同,与ANativeWindowBuffer不同,所以前2者之间可以直接类型强转,与第三者不行,
3. 类型转换接口
/*
总之
AHardwareBuffer <-----> GraphicBuffer
用reinterpret_cast<> 无地址偏移,直接强转
ANativeWindowBuffer <------> GraphicBuffer
用static_cast<>, 有地址偏移
AHardwareBuffer <------> ANativeWindowBuffer
需要先转成GraphicBuffer,再做第二次类型转换
**/
const GraphicBuffer* AHardwareBuffer_to_GraphicBuffer(const AHardwareBuffer* buffer) {
return GraphicBuffer::fromAHardwareBuffer(buffer);
}
GraphicBuffer* AHardwareBuffer_to_GraphicBuffer(AHardwareBuffer* buffer) {
return GraphicBuffer::fromAHardwareBuffer(buffer);
}
const ANativeWindowBuffer* AHardwareBuffer_to_ANativeWindowBuffer(const AHardwareBuffer* buffer) {
return AHardwareBuffer_to_GraphicBuffer(buffer)->getNativeBuffer();
}
ANativeWindowBuffer* AHardwareBuffer_to_ANativeWindowBuffer(AHardwareBuffer* buffer) {
return AHardwareBuffer_to_GraphicBuffer(buffer)->getNativeBuffer();
}
AHardwareBuffer* AHardwareBuffer_from_GraphicBuffer(GraphicBuffer* buffer) {
return buffer->toAHardwareBuffer();
}
sp<GraphicBuffer> GraphicBuffer::from(ANativeWindowBuffer* anwb) {
return static_cast<GraphicBuffer *>(anwb);
}
GraphicBuffer* GraphicBuffer::fromAHardwareBuffer(AHardwareBuffer* buffer) {
return reinterpret_cast<GraphicBuffer*>(buffer);
}
GraphicBuffer const* GraphicBuffer::fromAHardwareBuffer(AHardwareBuffer const* buffer) {
return reinterpret_cast<GraphicBuffer const*>(buffer);
}
AHardwareBuffer* GraphicBuffer::toAHardwareBuffer() {
return reinterpret_cast<AHardwareBuffer*>(this);
}
AHardwareBuffer const* GraphicBuffer::toAHardwareBuffer() const {
return reinterpret_cast<AHardwareBuffer const*>(this);
}
AHardwareBuffer* ANativeWindowBuffer_getHardwareBuffer(ANativeWindowBuffer* anwb) {
return AHardwareBuffer_from_GraphicBuffer(static_cast<GraphicBuffer*>(anwb));
}
ANativeWindowBuffer* GraphicBuffer::getNativeBuffer() const
{
return static_cast<ANativeWindowBuffer*>(
const_cast<GraphicBuffer*>(this));
}