SHM基于ASHMEM的替代方案

4

我正在将一个*nix平台下的库移植到Android系统,这个库使用共享内存或者shm。但是Android没有System V的shm,取而代之的是ashmem

有没有人知道一个映射shm调用到ashmem的适配库?Google搜索并没有提供很大的帮助。


我不得不投下第一张关闭票,因为这显然是不相关的... - jww
2个回答

3
这是我处理类似移植问题时的解决方案:
在创建和获取文件描述符时,我使用了替代方法,而非使用“shmfd = open(SHM_PATH, O_RDWR)”。
int fd = ashmem_create_region("SharedRegionName", size); 

并使用文件描述符获取基地址:

int base_address = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

您可以使用一个本地函数从本地代码向Java代码传递base_address并返回描述符。
Android具有名为MemoryFile的Ashmem包装类。您也可以查看它。
以下链接帮助我创建了自己的包装器:

3

这里有一个库,可以通过 LD_PRELOAD 来模拟使用 Android ashmem (shmget/shmat/shmdt/shmctl 调用) 的 Linux 共享内存,你也可以直接链接到这个库。

https://github.com/pelya/android-shmem


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