4

我正在开发从 *nix 到 Android 的库端口,该库使用共享内存或shm. Android 没有 System V shm。相反,它使用ashmem.

shm有人知道将调用映射到 shim 库ashmem吗?谷歌并不是很有帮助。

4

2 回答 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);

您可以使用返回描述符的本机函数将 base_address 从本机代码传递给您的 java 代码。

Android 有一个名为 MemoryFile 的 Ashmem 包装类。你也可以看看那个。

以下链接帮助我创建了自己的包装器:

于 2013-09-23T18:24:41.543 回答
3

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

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

于 2014-04-29T13:14:05.947 回答