Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(4)-阿里云开发者社区

开发者社区> 余二五> 正文

Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(4)

简介:
+关注继续查看
  2. MemoryBase
        文章开始时说过,MemoryBase接口是建立在MemoryHeapBase接口的基础上的,它们都可以作为一个Binder对象来在进程间进行数据共享,它们的关系如下所示:
 MemoryBase类包含了一个成员变量mHeap,它的类型的IMemoryHeap,MemoryBase类所代表的匿名共享内存就是通过这个成员变量来实现的。
        与MemoryHeapBase的分析过程一样,我们先来看MemoryBase类在Server端的实现,然后再来看它在Client端的实现。
        MemoryBase在Server端实现的类图如下所示:
        MemoryBase类在Server端的实现与MemoryHeapBase类在Server端的实现是类似的,这里只要把IMemory类换成IMemoryHeap类、把BnMemory类换成BnMemoryHeap类以及MemoryBase类换成MemoryHeapBase类就变成是MemoryHeapBase类在Server端的实现了,因此,我们这里只简单分析IMemory类和MemoryBase类的实现。
        IMemory类定义了MemoryBase类所需要实现的接口,这个类定义在frameworks/base/include/binder/IMemory.h文件中:
  1. class IMemory : public IInterface  
  2. {  
  3. public:  
  4.     ......  
  5.   
  6.     virtual sp<IMemoryHeap> getMemory(ssize_t* offset=0, size_t* size=0) const = 0;  
  7.   
  8.     ......  
  9.     void* pointer() const;  
  10.     size_t size() const;  
  11.     ssize_t offset() const;  
  12. };  
        成员函数getMemory用来获取内部的MemoryHeapBase对象的IMemoryHeap接口;成员函数pointer()用来获取内部所维护的匿名共享内存的基地址;成员函数size()用来获取内部所维护的匿名共享内存的大小;成员函数offset()用来获取内部所维护的这部分匿名共享内存在整个匿名共享内存中的偏移量。
 
        IMemory类本身实现了pointer、size和offset三个成员函数,因此,它的子类,即MemoryBase类,只需要实现getMemory成员函数就可以了。IMemory类的实现定义在frameworks/base/libs/binder/IMemory.cpp文件中:
  1. void* IMemory::pointer() const {  
  2.     ssize_t offset;  
  3.     sp<IMemoryHeap> heap = getMemory(&offset);  
  4.     voidconst base = heap!=0 ? heap->base() : MAP_FAILED;  
  5.     if (base == MAP_FAILED)  
  6.         return 0;  
  7.     return static_cast<char*>(base) + offset;  
  8. }  
  9.   
  10. size_t IMemory::size() const {  
  11.     size_t size;  
  12.     getMemory(NULL, &size);  
  13.     return size;  
  14. }  
  15.   
  16. ssize_t IMemory::offset() const {  
  17.     ssize_t offset;  
  18.     getMemory(&offset);  
  19.     return offset;  
  20. }  
        MemoryBase类声明在frameworks/base/include/binder/MemoryBase.h文件中:
  1. class MemoryBase : public BnMemory  
  2. {  
  3. public:  
  4.     MemoryBase(const sp<IMemoryHeap>& heap, ssize_t offset, size_t size);  
  5.     ......  
  6.     virtual sp<IMemoryHeap> getMemory(ssize_t* offset, size_t* size) const;  
  7.   
  8.     ......  
  9. private:  
  10.     size_t          mSize;  
  11.     ssize_t         mOffset;  
  12.     sp<IMemoryHeap> mHeap;  
  13. };  
       MemoryBase类实现在frameworks/base/libs/binder/MemoryBase.cpp文件中:
  1. MemoryBase::MemoryBase(const sp<IMemoryHeap>& heap,  
  2.         ssize_t offset, size_t size)  
  3.     : mSize(size), mOffset(offset), mHeap(heap)  
  4. {  
  5. }  
  6.   
  7. sp<IMemoryHeap> MemoryBase::getMemory(ssize_t* offset, size_t* size) const  
  8. {  
  9.     if (offset) *offset = mOffset;  
  10.     if (size)   *size = mSize;  
  11.     return mHeap;  
  12. }  
        在它的构造函数中,接受三个参数,参数heap指向的是一个MemoryHeapBase对象,真正的匿名共享内存就是由它来维护的,参数offset表示这个MemoryBase对象所要维护的这部分匿名共享内存在整个匿名共享内存块中的起始位置,参数size表示这个MemoryBase对象所要维护的这部分匿名共享内存的大小。
 
        成员函数getMemory的实现很简单,只是简单地返回内部的MemoryHeapBase对象的IMemoryHeap接口,如果传进来的参数offset和size不为NULL,还会把其内部维护的这部分匿名共享内存在整个匿名共享内存块中的偏移位置以及这部分匿名共享内存的大小返回给调用者。
        这里我们可以看出,MemoryBase在Server端的实现只是简单地封装了MemoryHeapBase的实现。1




本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966918,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
更快的Maven构建工具mvnd和Gradle哪个性能更好?(1)
更快的Maven构建工具mvnd和Gradle哪个性能更好?(1)
16 0
更快的Maven来了,我的天,速度提升了8倍!(3)
更快的Maven来了,我的天,速度提升了8倍!(3)
45 0
额!Java中用户线程和守护线程区别这么大?(3)
额!Java中用户线程和守护线程区别这么大?(3)
9 0
更快的Maven构建工具mvnd和Gradle哪个性能更好?(3)
更快的Maven构建工具mvnd和Gradle哪个性能更好?(3)
48 0
你真的了解CSS3硬件加速吗?
你真的了解CSS3硬件加速吗?
32 0
用谷歌云自建微软GitHub codespaces和VScode.dev云编译Cloud IDE是怎样一种体验?
你将拥有比微软官方vscode.dev 更强大的vscode谷歌云IDE,你可以随时随地坐在马桶上用599块钱的小米手机登陆网页版vscode开发一款APP,比如:Tiktok;这个网页版vscode比微软GitHub codespaces和VScode.dev官方更强大,它同样拥有terminal,重点是它编译不受本地网络的限制可以远程云编译,高速高效随时随地,而且是使用强大谷歌云服务器进行编译,爽哼! 下一步咱们搞个Android studio网页版云编译平台,好不好,宝? 下下一步咱们使用599块钱的小米手机远程连接网页版vscode和网页版Android studio开发一款安卓ap
9 0
python测试框架-pytest
python测试框架-pytest 一、pytest 介绍、运行、参数化和数据驱动、Fixture pytest安装与介绍 官网 : pip install -U pytest 查看版本号:pytest --version 为何选择pytest 兼容unittest 定制化插件开发 pycharm 配置github VSC--Git--Remotes... pycharm pytest 配置 settings--搜索pytest--Python integrated Tools--testing--选择pytest:根据黄色叹号fix安装pytest安装到环境
21 0
flutter项目如何打包(android)
打包前要做的 1.更换图标 andriod–》app–app–》src—》main-》Java----》res–》minpmap
9 0
常量和变量_C语言简介|学习笔记
快速学习常量和变量_C语言简介
5 0
flutter分平台主题定制
有时候,为了满足不同平台的用户需求,我们希望针对特定的平台设置不同的样式。比如,在 iOS 平台上设置浅色主题,在 Android 平台上设置深色主题。面对这样的需求,我们可以根据 defaultTargetPlatform 来判断当前应用所运行的平台,从而根据系统类型来设置对应的主题。
5 0
+关注
20382
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载