如何在Android中使用共享内存(IPC)(How to use Shared Memory (I

2019-08-31 13:00发布

我已经写在Linux的简单共享内存的C程序。
如何使用共享内存(或者我应该称之为“ashmem?”)购买Android?

我希望你能给我一个一步一步的指导。

Answer 1:

这里是我工作:
1)打开一个MemoryFile对象:MFILE;
2)创建服务映射它使用mmap到ashem;
3)还乡文件描述符(FD)客户端结合使用ParcelFileDescriptor PFD您服务;
4),是以fd和映射到使用MMAP灰烬客户端创建JNI;
5)在使用本fd和现在客户端可以读/使用InputStream对象写入相同的存储器区域的InputStream创建。
此链接显示了如何映射到MemoryFile ashem。 这个环节展示了如何通过AIDL和ParcelFileDescriptor发送本地文件描述符(FD),以客户端到客户端。

在服务器端,您将需要创建:
1)一种服务&AIDL穿过ParcelFileDescriptor天然FD到客户端; 2)在服务端,做映射甲JNI。

在客户端:1)方法绑定到服务,然后调用服务来获取本地FD; 2)甲JNI该FD映射到ashem。

然后映射的存储器区域可被读取由服务客户端和/写入。



Answer 2:

一种方法创建具有下列步骤的新ashmem区域:

(1)打开设备文件,“的/ dev / ashmem”而获得的文件描述符。 (2)调用ASHMEM_SET_NAME ioctl来设置ashmem名。 这似乎是虚拟设备文件,所以如果你的名字“my_mem”文件名更改为“的/ dev / ashmem / my_mem”。 (3)调用的ioctl ASHMEM_SET_SIZE设置ashmem大小,以字节为单位。

该cutils库有一个函数“ashmem_create_region”它包装起来,这些步骤制作成单个函数调用:

int fd = ashmem_create_region("my_mem", PAGE_SIZE * 20);

文件描述符可以与其他进程共享。 Android提供共享的表兄弟进程之间文件描述符一种特殊的方式,用所谓的“粘合剂”的另一个服务。 然后,每个进程mmaps文件:

char *map = mmap(NULL, PAGE_SIZE * 20, PROT_READ|PROT_WRITE,
                                       MAP_SHARED, fd, 0);

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



Answer 3:

在Android中使用的粘合剂IPC。 我认为粘结剂使用内核内存,这是在所有进程共享,对进程间通信。



Answer 4:

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

就像一个神奇的,它完美的作品。 您可以使用shmget的()的shmat()和shmdt()API的无缝地在Android上使用共享内存跨越独立的进程。 试试看。



文章来源: How to use Shared Memory (IPC) in Android