我有一个基于Java的Android应用程序,它使用两个本机子模块。我让他们通过从进程A中将其作为long
检索并将其传递给进程B来共享指针。我似乎遇到与此内存区域相关的问题,这些问题是偶发的并且取决于当前构建而不是更改我刚刚做了。
我是否需要使用ashmem
来正确完成此操作,或者我的方法(原则上)是否合理?
答案 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)中获得的。