我想将大型数据从一个流程/应用转移到 Android 中的另一个流程/应用,但有些如何使用 Java 层中的内存文件创建共享内存工作。
然后尝试在android native中创建共享内存,我读到的地方 可以使用ashmem_create_region API。但看起来这个API无法访问或打开。它在libcutils.so里面。
位于
android-ndk-r9c/platforms/android-19/arch-arm/usr/lib/rs/libcutils.so
Q1。如何在Android本机代码中访问此库。
Q2。如果无法访问,那么在ndk工具中提供此功能的目的是什么。
Q3。如果以某种方式我链接libcutils.so并能够使用libcutils.so在本机创建共享内存然后我可以使用此fd与Java层中的MemoryFile进行映射,这样就可以避免为每个数据事务写入应用程序本机副本。
答案 0 :(得分:2)
libcutils.so 以启用renderscript integration。它仍然是一个未记录的系统库,因为Android不承诺在所有平台上支持所有API,特别是在未来的平台上,请参阅on android-ndk user group上的更多内容。
这就是说,我应该承认,使用ashmem是非常安全的,因为从第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
目录中,因为{{3}在下面的评论中承诺。