2013-02-27 156 views
11

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

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

这是因为字节数组的大小大于1MB,并且绑定事务缓冲区的固定大小有限制为1MB 。即使尺寸限制较大,复制大量缓冲区以进行实时处理也是非常低效的。

问题 - 有没有一种方法可以让android在两个dalvik进程之间共享内存,这可以帮助解决问题?我查看了MemoryFile,但似乎MemoryFile只能用于在此时使用隐藏的API在进程之间共享内存。

回答

3

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

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定义。

+1

我看着ashmem,但在我的JAVA应用程序中如何使用ashmem?我不想用NDK负担应用程序。 – 2013-02-28 00:29:41

+1

这是一个应用程序,显示如何使用ashmem在不同应用程序之间/在本机C和Java之间进行mmap映射。 https://github.com/vecio/AndroidIPC – user3387542 2014-06-17 09:58:37

3

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

有一个在ProcessState.cpp

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

请尽量增加该值的参数。

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

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

+0

增加此值有什么风险,如果有的话? – barq 2016-06-24 12:37:07

相关问题