我找到了一些在Ansroid中使用共享内存的指南。我已经了解到,由于操作系统或用户强制销毁进程而导致内存泄漏,在Android中不存在shm_open。开发了ASHMEM功能。但是在我的NDK中找不到ashmem_create_region()和其他函数的声明。他们在哪?
发布于 2016-06-01 14:50:17
就像Android中的很多东西一样,答案是使用JNI。java.nio.MappedByteBuffer类封装了ashmem,并提供了读写方法来访问它。
不幸的是,如果您使用共享内存来提高性能,那么多次往返JNI并不是一个有吸引力的提议。Cedric 提出使用反射按名称检索ashmem句柄,这将工作,但可能在未来的框架中中断。(这确实发生了,BTW。只要有人认为"mFD“太模糊,"mFileDescriptor”就会是个更好的名字,或者诸如此类。)如果您想玩火,我建议按类型而不是名称检索描述符,因为类型不太可能改变。
Cedric还建议在C++中实现Binder,但这使您回到了最初的位置,因为Binder也没有包含在NDK中。相反,您需要通过用Java实现的绑定器服务传递句柄。
我知道,对于这样一个简单的特性来说,这是一项很大的工作。只映射一个文件并使用它就更容易了,这太糟糕了,因为基本的文件映射并不像ashmem那样对移动友好。:-(
发布于 2014-04-28 09:48:19
报头位于aosp的system/core/include/cutils/ashmem.h中。
不能将其用于常规应用程序,因为ashmem函数不是NDK:https://groups.google.com/forum/#!topic/android-ndk/eS9QK8EY968的一部分。
https://stackoverflow.com/questions/23202366
复制相似问题