2015-06-02 113 views
0

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

我需要用ashmem正确做到这一点,或者是我的方法(本金)的声音?

回答

0

没有保证存储器在一个方法,该方法是:a)到另一通道,b)以相同的虚拟位置,c)中线程安全的。

我做的是内存映射相同的文件分成多个流程和使用不安全类在此内存中执行线程安全的操作。

英特尔这项工作,应该在最新的ARM处理器工作,ARM处理器然而旧版本,我相信仍然在使用具有弱内存一致性保证,并且可能是不可靠的共享内存。

+0

你使用'ashmem'来完成这个吗?你是否说我需要使用'mmap'?我意识到我可以使用更慢,更占用内存的解决方案:1)在proc A上执行内存中的任务2)通过JNI将内存复制到Java 3)通过JNI将内存复制到proc B,4)反向重复 – EntangledLoops

+0

如果你使用'不安全'来访问'mmap',但是在Android上我并不使用OpenJDK/Oracle JVM上的JNI。我不使用额外的图书馆,尽管我写了一个更容易做到这一点。当你有一个ByteBuffer指向一个内存区域时,它可以在没有额外复制的情况下在Java中使用,你正在读/写它。 –

+0

您的意思是“它可以在没有额外复制的情况下用于Java”?除了什么之外呢?我必须从C创建它的地方复制内存,然后回到C处理它的地方,然后再将结果重新洗牌。在我看来,我的选择是A)通过学习这种'mmap'式解决方案而遭受挫折,或者B)使用效率较低/健壮的复制过程。我错了吗? – EntangledLoops

0

这是不可能的共享本机应用程序之间的指针,因为每个(本机)的应用程序有它自己的内存空间映射&。 Android确实提供了解决此问题的机制,称为匿名共享内存。这实际上是基于Linux的实现为同一目的。 Checkout this来自android的文件,了解更多有关在android中分享内存的信息。

下面是我使用的方案:
1) FD = ashmem_create_region( “my_shm_region”,大小); (fd < 0) 返回-1;如果(fd < 0) 返回-1; unsigned char * dataptr = mmap(NULL,size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);如果(数据== MAP_FAILED) 转出;

2)然后,可以通过FD到其他本机应用程序,并调用:
无符号字符* dataptr = MMAP(NULL,大小,PROT_READ | PROT_WRITE,MAP_SHARED,FD,0);

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)FD可以使用粘合剂另一机进程共享。有关活页夹的更多信息,请阅读this stack overflow answer

3)在其他的本机代码可以这样做:

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

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

相关问题