我已经在Linux中编写了一个简单的Shared Memory C程序。
如何在Android中使用共享内存(或者我应该称之为“ashmem?”)?
我希望你能给我一步一步的指导。
答案 0 :(得分:5)
这对我有用:
1)打开一个MemoryFile对象:mFile;
2)创建一个服务,使用mmap将其映射到ashem;
3)使用ParcelFileDescriptor pfd将本机文件描述符(fd)返回给绑定到您的服务的客户端;
4)为使用md的客户端创建JNI并使用mmap映射到灰烬;
5)使用此fd创建InputStream,现在客户端可以使用InputStream对象读/写相同的内存区域
这个link显示了如何将MemoryFile映射到ashem。此link显示如何通过AIDL和ParcelFileDescriptor将本机文件描述符(fd)发送到客户端。
在服务器端,您需要创建:
1)服务&通过ParcelFileDescriptor将本地fd传递给客户端的AIDL;
2)服务端的JNI,用于执行映射。
在客户端: 1)绑定服务然后调用服务获取本机fd的方法; 2)将fd映射到ashem的JNI。
然后,服务&可以读/写映射的存储区域。客户端。
答案 1 :(得分:3)
流程通过以下步骤创建新的ashmem区域:
(1)打开设备文件“/ dev / ashmem”并获取文件描述符。 (2)调用ASHMEM_SET_NAME ioctl设置ashmem名称。它似乎是虚拟设备文件,因此如果将其命名为“my_mem”,则文件名将更改为“/ dev / ashmem / my_mem”。 (3)调用ASHMEM_SET_SIZE ioctl来设置ashmem大小,以字节为单位。
cutils库有一个函数“ashmem_create_region”,它将这些步骤包装成一个函数调用:
int fd = ashmem_create_region("my_mem", PAGE_SIZE * 20);
文件描述符可以与其他进程共享。 Android提供了一种在表兄弟进程之间共享文件描述符的特殊方法,使用另一种名为“binder”的服务。然后每个进程都会映射文件:
char *map = mmap(NULL, PAGE_SIZE * 20, PROT_READ|PROT_WRITE,
MAP_SHARED, fd, 0);
瞧,瞧!即时共享内存。
答案 2 :(得分:0)
在Android中使用binder IPC。我认为绑定器使用内核内存,它在所有进程中共享,用于进程间通信。
答案 3 :(得分:0)
好吧,如果你想使用共享内存API,这里有一个解决方案 https://github.com/pelya/android-shmem
像魔术一样,它完美无缺。您可以使用shmget(),shmat()和shmdt()API无缝地在独立进程中使用android中的共享内存。试一试。