在两个原生应用之间共享内存

时间:2015-06-02 16:23:32

标签: java android java-native-interface

我有一个基于Java的Android应用程序,它使用两个本机子模块。我让他们通过从进程A中将其作为long检索并将其传递给进程B来共享指针。我似乎遇到与此内存区域相关的问题,这些问题是偶发的并且取决于当前构建而不是更改我刚刚做了。

我是否需要使用ashmem来正确完成此操作,或者我的方法(原则上)是否合理?

3 个答案:

答案 0 :(得分:0)

无法保证一个进程中的内存是a)可以访问另一个进程,b)在同一个虚拟位置,c)线程安全。

我所做的是将内存映射到多个进程中,并使用Unsafe类对此内存执行线程安全操作。

这项关于英特尔的工作应该适用于最新的ARM处理器,但是我认为仍在使用的旧版ARM处理器具有较弱的内存一致性保证,并且对于共享内存可能不可靠。

答案 1 :(得分:0)

由于每个(本机)应用程序都拥有自己的内存空间,因此无法在本机应用程序之间共享指针。映射。 Android确实提供了解决此问题的机制,称为匿名共享内存。这实际上是基于linux的实现目的。来自android的checkout this文档,了解有关在android中共享内存的更多信息。

以下是我使用的方案:
1)  fd = ashmem_create_region(“my_shm_region”,size); if(fd <0)     返回-1; unsigned char * dataptr = mmap(NULL,size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0); if(data == MAP_FAILED)     转出;

2)然后您可以将fd传递给其他原生应用并致电:
unsigned char * dataptr = mmap(NULL,size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);

答案 2 :(得分:0)

以下是我的建议:
1)通过ashm分配共享内存:

int fd = ashmem_create_region(name, size);
ashmem_pin_region(fd, 0, 0);
uint8_t *shm = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);  

2)可以使用binder将fd与另一个本机进程共享。有关活页夹的更多信息,请阅读this stack overflow answer

3)在其他本机代码中,您可以这样做:

uint8_t *shm = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fdclient, 0);   

其中fdclient是在上面的步骤2)中获得的。