MemoryHeapBase

MemroyHeapBase也是Android搞的一套基于Binder机制的对内存操作的类。既然是Binder机制,那么肯定有一个服务端(Bnxxx),一个代理端Bpxxx。看看MemoryHeapBase定义:

class MemoryHeapBase : public virtual BnMemoryHeap

{

果然,从BnMemoryHeap派生,那就是Bn端。这样就和Binder挂上钩了

//Bp端调用的函数最终都会调到Bn这来

对Binder机制不了解的,可以参考:

http://blog.csdn.net/Innost/archive/2011/01/08/6124685.aspx

有好几个构造函数,我们看看我们使用的:

MemoryHeapBase::MemoryHeapBase(size_t size, uint32_t flags, char const * name)

: mFD(-1), mSize(0), mBase(MAP_FAILED), mFlags(flags),

mDevice(0), mNeedUnmap(false)

{

const size_t pagesize = getpagesize();

size = ((size + pagesize-1) & ~(pagesize-1));

//创建共享内存,ashmem_create_region这个是系统提供的,可以不管它

//设备上打开的是/dev/ashmem设备,而Host上打开的是一个tmp文件

int fd = ashmem_create_region(name == NULL ? "MemoryHeapBase" : name, size);

mapfd(fd, size);//把刚才那个fd通过mmap方式得到一块内存

//不明白得去man mmap看看

mapfd完了后,mBase变量指向内存的起始位置, mSize是分配的内存大小,mFd是

ashmem_create_region返回的文件描述符

}

MemoryHeapBase提供了一下几个函数,可以获取共享内存的大小和位置。

getBaseID()--->返回mFd,如果为负数,表明刚才创建共享内存失败了

getBase()->返回mBase,内存位置

getSize()->返回mSize,内存大小

有了MemoryHeapBase,又搞了一个MemoryBase,这又是一个和Binder机制挂钩的类。

唉,这个估计是一个在MemoryHeapBase上的方便类吧?因为我看见了offset

那么估计这个类就是一个能返回当前Buffer中写位置(就是offset)的方便类

这样就不用用户到处去计算读写位置了。

class MemoryBase : public BnMemory

{

public:

MemoryBase(const sp<IMemoryHeap>& heap, ssize_t offset, size_t size);

virtual sp<IMemoryHeap> getMemory(ssize_t* offset, size_t* size) const;

protected:

size_t getSize() const { return mSize; }

ssize_t getOffset() const { return mOffset; }

const sp<IMemoryHeap>& getHeap() const { return mHeap; }

};

好了,明白上面两个MemoryXXX,我们可以猜测下大概的使用方法了。

<!--[if !supportLists]-->l <!--[endif]-->BnXXX端先分配BnMemoryHeapBase和BnMemoryBase,

<!--[if !supportLists]-->l <!--[endif]-->然后把BnMemoryBase传递到BpXXX

<!--[if !supportLists]-->l <!--[endif]-->BpXXX就可以使用BpMemoryBase得到BnXXX端分配的共享内存了。

注 意,既然是进程间共享内存,那么Bp端肯定使用memcpy之类的函数来操作内存,这些函数是没有同步保护的,而且Android也不可能在系统内部为这 种共享内存去做增加同步保护。所以看来后续在操作这些共享内存的时候,肯定存在一个跨进程的同步保护机制。我们在后面讲实际播放的时候会碰到。

另外,这里的SharedBuffer最终会在Bp端也就是AudioFlinger那用到。

更多相关文章

  1. 【Android(安卓)XML】Android(安卓)XML 转 Java Code 系列之 Sel
  2. android 键盘问题
  3. SurfaceFlinger启动过程分析(一)、(二)、(三)、(四)【转】
  4. 关于JAVA回调函数和Android事件响应
  5. Android(安卓)Audio代码分析6 - AudioEffect
  6. android 之数据存储(IO)
  7. android wakelock 解析
  8. Android函数计算器(含源码,Android测试工程)
  9. Android服务查询完整过程源码分析

随机推荐

  1. Android内存管理机制和内存泄漏分析及优
  2. Android(安卓)6.0 权限请求问题
  3. Android音视频处理技术 视频录制
  4. 塔防游戏《android防御战》上线了
  5. 《Android 开发入门》我认识中的Android
  6. 2013 android经典实例及赚钱心得
  7. XMPP协议实现原理介绍
  8. Android周学习Step By Step(5)--常用widget
  9. 深入浅出 - Android系统移植与平台开发(六
  10. Android 三大图片缓存原理、特性对比