我想要一个从 native 代码映射和访问的共享内存块(ashmem
区域)。我还希望这个 block 被多个应用程序使用。我还希望它能在 SDK 级别 7 (Android 2.1) 上运行
有两条路线。我可以用 native 代码创建一个 ashmem 区域;但接下来的问题是——如何将整数文件描述符传递给另一个进程?您可以通过 Parcel
编码 FileDescriptor
对象,但无法围绕原始 FD 构造一个对象。还有 ParcelFileDescriptor
支持构造和检索整数 FD,但相关方法仅在 SDK 级别 12 或更高级别中支持。
或者,我可以创建一个MemoryFile
。有一个 fugly way在包裹中传递它。但是我如何从中检索文件描述符,以便 native 代码有一些东西可以mmap()
?
最佳答案
在 Android 1.5 到 4.1 之后的所有版本中,FileDescriptor
都有一个名为 descriptor
的 int
数据成员。它在早期版本的 Android 上是包私有(private)的,在最新版本上是私有(private)的。通过一些有意的访问控制颠覆,您可以访问它 - 通过反射或通过 JNI。每个都可以绕过访问控制 - 在反射的情况下,通过 Field.setAccessible()
,在 JNI 的情况下 - 默认情况下。
考虑到这一点,您可以围绕原生 FD 构造一个 FileDescriptor
就好了。构造一个空白的,然后设置descriptor
。这就是 Android 代码在构建这些代码时所做的事情。
这个肮脏的 hack 最终是否会被破解,谁知道呢。幸运的是,在我的案例中它不是核心功能 - 有一些优雅的降级。
如果平台允许,可以有条件地使用受支持的 ParcelFileDescriptor
方法,使用字段访问 hack 作为后备。这样,它将是相对 future 的证明。
关于android - NDK 中的共享内存区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12864778/