【问题标题】:shared memory in android ndkandroid ndk中的共享内存
【发布时间】:2014-02-25 11:43:11
【问题描述】:

我想将大数据从一个进程/应用程序传输到 Android 中的另一个进程/应用程序,但有些如何使用 Java 层中的内存文件创建共享内存'不工作。

然后尝试在我阅读的某个地方在 android native 中创建共享内存
可以使用 ashmem_create_region API。但看起来这个 API 无法访问或打开。它在 libcutils.so 中。

在

android-ndk-r9c/platforms/android-19/arch-arm/usr/lib/rs/libcutils.so

第一季度。如何在android原生代码中访问这个库。

第二季度。如果无法访问,那么在 ndk 工具中提供此功能的目的是什么。

第三季度。如果我以某种方式链接了 libcutils.so 并能够使用 libcutils.so 在本机中创建共享内存那么我可以使用这个 fd 与 Java 层中的 MemoryFile 进行映射,这样它将避免为每个数据事务写入应用程序本机副本。

【问题讨论】:

    标签: java android android-ndk


    【解决方案1】:

    libcutils.so 包含在 ndk 中以启用 renderscript integration。它仍然是一个未记录的系统库,因为 Android 不承诺在所有平台上支持其所有 API,尤其是在未来的平台上,请参阅on android-ndk user group 了解更多信息。

    这就是说,我应该承认使用 ashmem 是相当安全的,因为从 v.1 开始它就明确地显示为 documented in Java API。我为链接 libcutils.so elsewhere on SO 编写了一个简短的解决方案。

    这里是关于ashmem_create_region() API 和 IPC 警告的讨论:https://groups.google.com/forum/m/#!topic/android-platform/L6a6Xvn4HSI。 tl;nr:你仍然需要 Binder 进行握手。

    您的 Java 代码可以使用一些 workarounds 访问 fd。

    更新: 新的 NDK r9d 已发布,并且 libcutils.so 不再位于 platforms/android-19/arch-arm/usr/lib 目录中,正如 @Tim Murray 在下面的 cmets 中所承诺的那样。

    【讨论】:

    • 在查看您的 cmets 以了解我在下面尝试过的有关链接 lib 的其他问题后,我还从 android-ndk-r9c/platforms/android-19/ 将 libcutils.so 复制到了我的 libs/armeabi 文件夹中arch-arm/usr/lib/rs/libcutils.so LOCAL_LDLIBS := -llog LOCAL_LDLIBS += -L$(LOCAL_PATH)/libs/libcutils.so LOCAL_LDLIBS += -lcutils 仍然报错:找不到 -lcutils
    • 不要依赖 RS NDK 包中的 libcutils.so;它被错误地包括在内,将在不久的将来被删除。 (其中的所有 .SO 都将被删除,只保留静态库)
    • @Sachin:如果您正确地从Android.mk 复制/过去,您将libcutils 复制到/libs/armeabi 并告诉链接器在/libs 中查找它;难怪没有找到。但鉴于Tim 的评论,我建议从您的设备或模拟器中提取库。您也可以从官方 git 存储库中复制 ashmem-dev.c,并将其(或其中的必要部分)静态链接到您的库中。
    • 谢谢大家,我如何能够在我的项目中链接这个库,现在我有有效的 fd 用于共享内存。我的申请也通过了。我通过 pfd = ParcelFileDescriptor.adoptFd(fd); 调用 PercelFileDescriptor 来共享这个 fd;并将此 pfd 发送到远程的其他应用程序/进程。在这个远程过程中,我得到 PercelFileDescriptor 通过它 FileDescriptor fd = pfd.getFileDescriptor(); FileOutputStream fos = new FileOutputStream(fd); FileChannel fc = fos.getChannel(); int len = fc.write(bytebuf);一些如何写 len = 0,任何关于写失败的建议
    • @TimMurray:请注意(截至)build/core/build-binary.mk 仍将 cutils 和 lib/rs 中的其他一些剩余部分列为合法系统库。
    猜你喜欢
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多