接口MemoryBase是建立在接口MemoryHeapBase的基础上的,两者都可以作为一个Binder对象在进程之间实现数据共享。
1.在Server端的实现
首先分析类MemoryBase在Server端的实现,MemoryBase在Server端只是简单地封装了MemoryHeapBase的实现。类MemoryBase在Server端的实现与类MemoryHeapBase在Server端的实现类似,只需在整个类图接结构中实现如下转换即可。
把类IMemory换成类IMemoryHeap。
把类BnMemory换成类BnMemoryHeap。
把类MemoryBase换成类MemoryHeapBase。
类IMemory在文件frameworks\native\include\binder\IMemory.h中实现,功能是定义类MemoryBase所需要的实现接口。类IMemory的实现代码如下。
在类IMemory中定义了如下的成员函数:
getMemory:功能是获取内部的MemoryHeapBase对象的IMemoryHeap接口。
pointer():功能是获取内部所维护的匿名共享内存的基地址。
size():功能是获取内部所维护的匿名共享内存的大小。
offset():功能是获取内部所维护的匿名共享内存在整个匿名共享内存中的偏移量。(www.daowen.com)
类IMemory在本身定义过程中实现了三个成员函数:pointer、size和offset,其子类MemoryBase只需实现成员函数getMemory即可。类IMemory的具体实现在文件frameworks\native\libs\binder\IMemory.cpp中定义,具体实现代码如下。
类MemoryBase是一个本地Binder对象类,在文件frameworks\native\include\binder\MemoryBase.h中声明,具体实现代码如下。
类MemoryBase的具体实现在文件frameworks\native\libs\binder\MemoryBase.cpp中定义,具体实现代码如下。
2.MemoryBase类在Client端的实现
再来看MemoryBase类在Client端的实现,类MemoryBase在Client端的实现与类MemoryHeapBase在Client端的实现类似,只需要进行如下的类转换即可成为MemoryHeapBase在Client端的实现。
把类IMemory换成类IMemoryHeap。
把类BpMemory换成类BpMemoryHeap。
类BpMemory用于描述类MemoryBase服务的代理对象,在文件文件frameworks\native\libs\binder\IMemory.cpp中定义,具体实现代码如下。
类BpMemory中的成员函数getMemory在文件文件frameworks\native\libs\binder\IMemory.cpp中定义,具体实现代码如下。
如果成员变量mHeap的值为NULL,表示此BpMemory对象还没有建立Ashmem,此时会调用一个Binder进程去Server端请求Ashmem信息。通过引用信息中的Server端的MemoryHeapBase对象的引用heap,可以在Client端进程中创建一个BpMemoryHeap远程接口,最后将这个BpMemoryHeap远程接口保存在成员变量mHeap中,同时从Server端获得的信息还包括这块Ashmem在整个匿名共享内存中的偏移位置以及大小。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。