Android NDK共享内存:如何使用ashmem_create_region?

时间:2014-04-21 17:25:39

标签: android-ndk shared-memory

我在Ansroid OS中找到了一些使用共享内存的指南。我已经了解到,由于操作系统或用户强制终止进程导致内存泄漏,Android amymore中不存在shm_open。 相反,开发了ASHMEM功能。但我在NDK中找不到ashmem_create_region()和其他功能的声明。它们在哪里?

2 个答案:

答案 0 :(得分:3)

与Android中的许多内容一样,答案是使用JNI。 Java类java.nio.MappedByteBuffer包装ashmem并提供读/写方法来访问它。

不幸的是,如果您使用共享内存来提升性能,那么通过JNI的多次往返并不是一个有吸引力的主张。 Cedric Fung proposes使用反射按名称检索ashmem句柄,这将起作用但可能在未来的框架中中断。 (这确实发生了,顺便说一句。所有需要的是有人决定" mFD"太模糊了," mFileDescriptor"会是一个更好的名字,或者其他一些。)如果你想玩有火,我建议按类型而不是按名称检索描述符,因为类型不太可能改变。

Cedric还建议在C ++中实现Binder,但是这会让你回到起点,因为Binder也没有包含在NDK中。相反,您需要通过Java实现的绑定服务传递句柄。

我知道,这么简单的功能需要做很多工作。更容易mmap一个文件并使用它,这太糟糕了,因为基本的文件映射几乎不像ashmem那样适合移动设备。 : - (

答案 1 :(得分:0)

标题位于aosp的system / core / include / cutils / ashmem.h中。

您不能将它用于常规应用程序,因为ashmem函数不是NDK的一部分: https://groups.google.com/forum/#!topic/android-ndk/eS9QK8EY968