android - NDK 中的共享内存区域

标签 android android-ndk shared-memory parcel ashmem

我想要一个从 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 都有一个名为 descriptorint 数据成员。它在早期版本的 Android 上是包私有(private)的,在最新版本上是私有(private)的。通过一些有意的访问控制颠覆,您可以访问它 - 通过反射或通过 JNI。每个都可以绕过访问控制 - 在反射的情况下,通过 Field.setAccessible(),在 JNI 的情况下 - 默认情况下。

考虑到这一点,您可以围绕原生 FD 构造一个 FileDescriptor 就好了。构造一个空白的,然后设置descriptor。这就是 Android 代码在构建这些代码时所做的事情。

这个肮脏的 hack 最终是否会被破解,谁知道呢。幸运的是,在我的案例中它不是核心功能 - 有一些优雅的降级。

如果平台允许,可以有条件地使用受支持的 ParcelFileDescriptor 方法,使用字段访问 hack 作为后备。这样,它将是相对 future 的证明。

关于android - NDK 中的共享内存区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12864778/

相关文章:

android - 带有 intent-filter 参数的 pathPattern

android-ndk - Google Play 游戏服务集成失败, "Play Games callback indicates connection failure."

android - 如何自动将 "Add native support"到从现有源创建的 Android 项目?

android - 使用 android cmake 添加传感器链接器

c++ - 无法释放由 C++ 中的 CreateFileMapping 和 MapViewOfFile 创建的共享内存

android - 发布调试并发布到 artifactory

java - SimpleDateFormat 添加几分钟

python - 在进程之间共享 numpy 和 scipy 对象

android - 如何在 AOSP - fslota 中制作自己的 OTA 应用程序?

C shmat 函数