我找到了一些在Ansroid操作系统中使用共享内存的指南。我了解到,由于操作系统或用户强制终止进程导致内存泄漏,shm_open在安卓系统中不存在。取而代之的是开发ASHMEM功能。但在我的NDK中找不到ashmem_create_region()
和其他函数的声明。他们在哪里?
与Android中的许多东西一样,答案是使用JNI。Java类Java.nio.MappedByteBuffer封装ashmem并提供访问它的读/写方法
不幸的是,如果您使用共享内存来提高性能,那么通过JNI进行多次往返并不是一个有吸引力的提议。Cedric Fung建议使用反射按名称检索ashmem句柄,这将起作用,但可能会在未来的框架中中断。(顺便说一句,这种情况确实发生了。只需要有人认为"mFD"太模糊,"mFileDescriptor"会是一个更好的名称,或者诸如此类。)如果你想玩火,我建议按类型而不是按名称检索描述符,因为类型不太可能更改。
Cedric还建议在C++中实现Binder,但这将使您回到最初的位置,因为Binder也不包括在NDK中。相反,您需要通过Java中实现的绑定服务来传递句柄。
我知道,这么简单的功能需要做很多工作。只对文件进行mmap并使用它会更容易,这太糟糕了,因为基本的文件映射不如ashmem对移动友好。:-(
头在aosp的system/core/include/cutils/ashmem.h中。
您不能将其用于常规应用程序,因为ashmem函数不是NDK的一部分:https://groups.google.com/forum/#!主题/android ndk/eS9QK8EY968