我已经在Linux中编写了一个简单的共享内存C程序。
在Android中,我该如何使用共享内存(或者我应该叫它“ashmem”)?
我希望你能给我提供一份逐步指南。
我已经在Linux中编写了一个简单的共享内存C程序。
在Android中,我该如何使用共享内存(或者我应该叫它“ashmem”)?
我希望你能给我提供一份逐步指南。
以下是我的解决方案:
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。
然后,服务和客户端都可以读/写映射的内存区域。
int fd = ashmem_create_region("my_mem", PAGE_SIZE * 20);
char *map = mmap(NULL, PAGE_SIZE * 20, PROT_READ|PROT_WRITE,
MAP_SHARED, fd, 0);
那么,瞧!即时共享内存。
在Android中使用Binder IPC。我认为Binder使用内核内存进行进程间通信,该内存在所有进程之间共享。
如果你想使用共享内存API,这里有一个解决方案https://github.com/pelya/android-shmem
就像魔术一样,它完美地工作。你可以使用shmget()、shmat()和shmdt() API在Android中跨独立进程无缝地使用共享内存。试试吧。