如何在Android中使用共享内存(IPC)

5 c linux android shared-memory

我已经在Linux中编写了一个简单的Shared Memory C程序.
如何在Android中使用共享内存(或者我应该称之为"ashmem?")?

我希望你能给我一步一步的指导.

us_*_*vid 6

这对我
有用:1)打开一个MemoryFile对象:mFile;
2)创建一个服务,使用mmap将其映射到ashem;
3)使用ParcelFileDescriptor pfd将本机文件描述符(fd)返回给绑定到您的服务的客户端;
4)为使用md的客户端创建JNI并使用mmap映射到灰烬;
5)使用此fd创建InputStream,现在客户端可以使用InputStream对象读/写相同的内存区域.
链接显示如何将MemoryFile映射到ashem.此链接显示如何通过AIDL和ParcelFileDescriptor将本机文件描述符(fd)发送到客户端.

在服务器端,您将需要创建:
1)服务和AIDL,通过ParcelFileDescriptor将本机fd传递给客户端; 2)服务端的JNI,用于执行映射.

在客户端:1)绑定服务然后调用服务获取本机fd的方法; 2)将fd映射到ashem的JNI.

然后,服务和客户端可以读/写映射的存储器区域.


Dan*_*Liu 4

一个进程通过以下步骤创建一个新的 ashmem 区域:

\n\n

(1) 打开设备文件\xe2\x80\x9c/dev/ashmem\xe2\x80\x9d并获取文件描述符。\n(2) 调用ASHMEM_SET_NAME ioctl 设置ashmem 名称。它似乎是虚拟设备文件,因此如果将其命名为 \xe2\x80\x9cmy_mem\xe2\x80\x9d,文件名将更改为 \xe2\x80\x9c/dev/ashmem/my_mem\xe2\x80\x9d。 \n(3) 调用 ASHMEM_SET_SIZE ioctl 设置 ashmem 大小(以字节为单位)。

\n\n

cutils 库有一个函数 \xe2\x80\x9cashmem_create_region\xe2\x80\x9d ,它将这些步骤包装到一个函数调用中:

\n\n
int fd = ashmem_create_region("my_mem", PAGE_SIZE * 20);\n
Run Code Online (Sandbox Code Playgroud)\n\n

文件描述符可以与其他进程共享。Android 提供了一种特殊的方式在表兄弟进程之间共享文件描述符,使用另一个名为 \xe2\x80\x9cbinder\xe2\x80\x9d 的服务。然后每个进程映射该文件:

\n\n
char *map = mmap(NULL, PAGE_SIZE * 20, PROT_READ|PROT_WRITE,\n                                       MAP_SHARED, fd, 0);\n
Run Code Online (Sandbox Code Playgroud)\n\n

而且,瞧!即时共享内存。

\n