GraphicBuffer、AHardwareBuffer、ANativeWindowBuffer关系

本文详细探讨了AHardwareBuffer、GraphicBuffer和ANativeWindowBuffer之间的关系。它们实际上是同一个东西的不同表现形式,其中 GraphicBuffer 继承自 ANativeWindowBuffer。AHardwareBuffer 是一个抽象概念,需要通过reinterpret_cast转换,而转换到ANativeWindowBuffer则需要经过两次转换。文章还提供了具体的转换函数示例,揭示了多继承和虚函数在类型转换中涉及的地址偏移问题。

共同点 :

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 没有具体的类型,是个空结构体,类似于voi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值