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

时间:2013-02-27 22:06:40

标签: android

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

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

这是因为字节数组的大小是> 1MB和活页夹事务缓冲区的固定大小有限,为1MB。即使大小限制更大,复制大缓冲区进行实时处理也是非常低效的。

问题 - android有没有办法在两个dalvik进程之间共享内存,这有助于解决问题?我看了MemoryFile但是看起来MemoryFile似乎只能用于在使用隐藏API的进程之间共享内存。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

查看 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中定义。

答案 2 :(得分:3)

如果您能够修改Android系统,则可以扩大交易规模。 Binder事务缓冲区具有有限的固定大小,目前为1Mb

ProcessState.cpp中有一个参数

#define BINDER_VM_SIZE ((1*1024*1024) - (4096 *2))

请尝试增加此值。

如果您无法执行此操作,请尝试将数据分成多个事务。

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

相关问题