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

5

我已经在Linux中编写了一个简单的共享内存C程序。
在Android中,我该如何使用共享内存(或者我应该叫它“ashmem”)?

我希望你能给我提供一份逐步指南。

4个回答

7
以下是我为您翻译的内容:

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

在服务器端,您需要创建:
1)传递本地fd给客户端的服务和AIDL,使用ParcelFileDescriptor; 2)在服务端上创建一个JNI来进行映射。

在客户端上: 1)绑定到服务的方法,然后调用服务以获取本地fd; 2)创建一个JNI,将fd映射到ashem。

然后,服务和客户端都可以读/写映射的内存区域。


4
一个进程创建一个新的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);

那么,瞧!即时共享内存。


我又回来了,伙计...使用AOSP,我制作了一个可以在Android上本地运行的“Hello World” C程序。我想让这个“Hello World”程序具备ashmem功能,这可行吗? - user2297764

0

在Android中使用Binder IPC。我认为Binder使用内核内存进行进程间通信,该内存在所有进程之间共享。


Binder仅限于1 Mb或更少的事务,因此如果您需要更大的事务,ashmem是正确的选择。 - Jk Jensen

0

如果你想使用共享内存API,这里有一个解决方案https://github.com/pelya/android-shmem

就像魔术一样,它完美地工作。你可以使用shmget()、shmat()和shmdt() API在Android中跨独立进程无缝地使用共享内存。试试吧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接