几个与内存相关的类的头文件如下所示:
IMemory.h
:定义内存相关类的接口,表示堆内存的类
IMemoryHeap
和
BnMemoryHeap
,表示一般内存的类
IMemory
和
BnMemory
。
MemoryHeapBase.h
:定义类
MemoryHeapBase
,继承并实现
BnMemoryHeap
MemoryBase.h
:定义类
MemoryBase
,继承并实现
BnMemory
在一般的使用过程中,通常是以使用
MemoryHeapBase
类分配一块堆内存(类似
malloc
),而
MemoryBase
表示从一块分配好堆内存中的一部分内存。
class AudioTrackJniStorage {
public:
sp<MemoryHeapBase>
mMemHeap;//
这两个Memory
很重要
sp<MemoryBase>
mMemBase;
audiotrack_callback_cookie mCallbackData;
int
mStreamType;
bool allocSharedMem(int sizeInBytes) {
mMemHeap = new MemoryHeapBase(sizeInBytes, 0, "AudioTrack Heap Base");
mMemBase = new MemoryBase(mMemHeap, 0, sizeInBytes);
//
注意用法,先弄一个HeapBase
,再把HeapBase
传入到MemoryBase
中去。
return true;
}
};
2 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
)的方便类
这样就不用用户到处去计算读写位置了。
分享到:
相关推荐
ashmem_C实例C++层的
流程一: 1.ashmeme_create_region 2.mmap 3.读或写共享内存。 4.关闭。 流程乙: 1.通过binder的ParcelFileDescriptor在两个进程之间事务fd。 因为 struct 文件对于 linux 内核是全局的。 所以 binder 驱动程序...
Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析
安卓很多模块都用到了ashmem,为了更好的学习各个模块,了解ashmem的原理是必不可少的!
android传递大文件的话,第一想到的就是匿名共享内存了,但是进程间怎么共享匿名共享内存的。试想进程A创建匿名共享内存,进程B怎么得共享内存读出数据?熬得凌晨2点多写个demo,备忘和分享!
libandroid-shmem 在使用ashmem在Android上进行System V共享内存(shmget,shmat,shmdt和shmctl)仿真。 它创建的共享内存段将在创建过程销毁它们或死时自动销毁,这与System V共享内存行为不同。 基于先前工作。...
结合例子介绍了android 中Pmem 的应用和ashmem 的区别
第6章 Ashmem匿名共享内存系统 6.1 Ashmem驱动程序 6.1.1 基础数据结构 6.1.2 匿名共享内存设备的初始化过程 6.1.3 匿名共享内存设备文件的打开过程 6.1.4 匿名共享内存设备文件的内存映射过程 6.1.5 ...
Ashmem是一个共享内存驱动,它与传统的共享内存相比,最大的特点是它是通过文件描述符来描述的,并且可以动态地进行分块管理。动态分块管理的目的是可以将部分不再使用了的内存交回给系统,非常适合内存较小的移动...
第6章 Ashmem匿名共享内存系统 6.1 Ashmem驱动程序 6.1.1 基础数据结构 6.1.2 匿名共享内存设备的初始化过程 6.1.3 匿名共享内存设备文件的打开过程 6.1.4 匿名共享内存设备文件的内存映射过程 6.1.5 匿名...
android内存管理目录 Low Memory Killer Ashmem Pmem dalvik虚拟机内存管理
Android内核驱动—内存管理 Low Memory Killer Ashmem pmem
Android专用驱动系统篇介绍了Logger日志驱动程序、Binder进程间通信驱动程序以及Ashmem匿名共享内存驱动程序;Android应用程序框架篇从组件、进程、消息以及安装四个维度对Android应用程序的框架进行了深入的剖析。
Android专用驱动系统篇介绍了Logger日志驱动程序、Binder进程间通信驱动程序以及Ashmem匿名共享内存驱动程序;Android应用程序框架篇从组件、进程、消息以及安装四个维度对Android应用程序的框架进行了深入的剖析。 ...
Android专用驱动系统篇介绍了Logger日志驱动程序、Binder进程间通信驱动程序以及Ashmem匿名共享内存驱动程序;Android应用程序框架篇从组件、进程、消息以及安装四个维度对Android应用程序的框架进行了深入的剖析。 ...
Android专用驱动系统篇介绍了Logger日志驱动程序、Binder进程间通信驱动程序以及Ashmem匿名共享内存驱动程序;Android应用程序框架篇从组件、进程、消息以及安装四个维度对Android应用程序的框架进行了深入的剖析。...
Android专用驱动系统篇介绍了Logger日志驱动程序、Binder进程间通信驱动程序以及Ashmem匿名共享内存驱动程序;Android应用程序框架篇从组件、进程、消息以及安装四个维度对Android应用程序的框架进行了深入的剖析。 ...
Android专用驱动系统篇介绍了Logger日志驱动程序、Binder进程间通信驱动程序以及Ashmem匿名共享内存驱动程序;Android应用程序框架篇从组件、进程、消息以及安装四个维度对Android应用程序的框架进行了深入的剖析。 ...
Android专用驱动系统篇介绍了Logger日志驱动程序、Binder进程间通信驱动程序以及Ashmem匿名共享内存驱动程序;Android应用程序框架篇从组件、进程、消息以及安装四个维度对Android应用程序的框架进行了深入的剖析
前段时间项目需求,ashmem通过java创建共享内存,在底层C程序接收fd后读数据,在别人的基础上修改,备忘。