Android 在Dalvik中的两个进程之间共享内存

Android 在Dalvik中的两个进程之间共享内存,android,Android,我创建了一个android服务,它向应用程序公开一个接口,以接受一个摄像头帧字节数组。该服务使用本机库处理此相机帧,并返回有关相机帧的一些数据。目标是能够实时处理相机预览帧 问题-我的AIDL文件有一个名为initFrame的API(在字节[]frame中)。每当我从应用程序(在单独的进程中运行)调用此API时,我都会得到一个异常- 这是因为字节数组的大小大于1MB,绑定器事务缓冲区的固定大小为1MB。即使大小限制更大,为实时处理复制大型缓冲区也是非常低效的 问题-android中是否有一种方法

我创建了一个android服务,它向应用程序公开一个接口,以接受一个摄像头帧字节数组。该服务使用本机库处理此相机帧,并返回有关相机帧的一些数据。目标是能够实时处理相机预览帧

问题-我的AIDL文件有一个名为initFrame的API(在字节[]frame中)。每当我从应用程序(在单独的进程中运行)调用此API时,我都会得到一个异常-

这是因为字节数组的大小大于1MB,绑定器事务缓冲区的固定大小为1MB。即使大小限制更大,为实时处理复制大型缓冲区也是非常低效的


问题-android中是否有一种方法可以在两个dalvik进程之间共享内存,从而帮助解决问题?我看过了,但MemoryFile目前似乎只能用于在使用隐藏API的进程之间共享内存。

对于这种类型的事务,我将在两个进程之间使用套接字连接。双方都可以根据需要流式传输数据和缓冲区,而不会占用大量资源。对您的服务来说,监听套接字并让客户端连接到套接字并发送数据应该相对容易。

看看ashmem子系统,它是一个共享内存分配器,类似于POSIX SHM,但具有不同的行为和更简单的基于文件的API

也许这就是你想要的:

int ashmem_create_region(const char *name, size_t size);
int ashmem_set_prot_region(int fd, int prot);
int ashmem_pin_region(int fd, size_t offset, size_t len);
int ashmem_unpin_region(int fd, size_t offset, size_t len);
int ashmem_get_size_region(int fd);

这是在
system/core/include/cutils/ashmem.h

中定义的。如果您能够修改Android系统,则可以扩大事务大小。活页夹事务缓冲区的固定大小有限,目前为1Mb

ProcessState.cpp中有一个参数

#define BINDER_VM_SIZE ((1*1024*1024) - (4096 *2))
请尝试增加此值

如果您无法做到这一点,请尝试将数据分成多个事务


此外,您还可以采用其他IPC机制,比如在
system/core/include/cutils/ashmem.h
中使用本机代码。这并不难。据我所知,一些供应商使用ashmem在一些内核上实现绑定器事务,而不支持绑定器驱动程序。您也可以使用socket。

我看过ashmem,但如何在JAVA应用程序中使用ashmem?我不想让NDK给应用程序增加负担。这是一个演示如何在不同应用程序之间/在原生C和Java之间使用ashmem到mmap的应用程序。增加该值的风险(如有)是什么?