基于ASHMEM的SHM替换

时间:2013-07-07 07:36:32

标签: android unix shared-memory ashmem

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

是否有人知道要将shm来电映射到ashmem的填充程序库?谷歌并没有太大的帮助。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

在处理类似的移植问题时,这就是我的工作方式:

不是使用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的包装类。你也可以看一下。

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