NDK 是否支持消息队列?
Does NDK provide support for message queues?
我正在尝试使用 android ndk 构建共享库。当我 运行 ndk build
时出现此错误
fatal error: 'mqueue.h' file not found
根据我在谷歌上的理解,问题是 Android 确实为某些 POSIX 或 System V 功能(如消息队列)提供支持。
所以我想知道这是否正确?如果是,我有哪些选择 - 我可以对我的应用程序进行哪些更改以模仿消息队列?
(我在 Ubuntu 14.04 PC 上使用 android-ndk-r16b)
是的,POSIX Android 以及其他一些 SysV IPC 机制不支持消息队列。简而言之就是因为可能造成不可回收的资源泄漏。这不仅适用于 "forgets" 释放获取的 IPC 资源的错误应用程序,而且适用于所有应用程序。原因是 Android 大量使用 kill(app_pid, SIGKILL)
将系统资源从后台进程回收到用户刚刚启动的新进程。结果应用程序死了,没有机会执行拆卸。内核无法释放该 IPC 资源,因为它们可能以不可预测的方式被其他进程共享(与文件描述符和虚拟内存不同)。请记住 Android 主要在 resource-constrained 硬件上运行,因此某种此类资源重新排列是不可避免的。
更多背景是here。旧的 NDK 包包含此文档,但在某些时候它已被删除。
Android 上的 IPC 的替代方法通常包括 Binder
-based solutions. In native code you may use ashmem
,它为共享内存段提供接口。最新的平台版本向它公开 public API,请参阅 <android/sharedmem.h>
。但对于较旧的平台,您可以通过与 ashmem 驱动程序直接交互来实现类似的功能,请参阅 libcutils
来源。
最后您可能仍会使用管道、UNIX-domain 套接字和可能的命名管道(当然如果底层文件系统支持此类 inode)。
我正在尝试使用 android ndk 构建共享库。当我 运行 ndk build
时出现此错误fatal error: 'mqueue.h' file not found
根据我在谷歌上的理解,问题是 Android 确实为某些 POSIX 或 System V 功能(如消息队列)提供支持。
所以我想知道这是否正确?如果是,我有哪些选择 - 我可以对我的应用程序进行哪些更改以模仿消息队列?
(我在 Ubuntu 14.04 PC 上使用 android-ndk-r16b)
是的,POSIX Android 以及其他一些 SysV IPC 机制不支持消息队列。简而言之就是因为可能造成不可回收的资源泄漏。这不仅适用于 "forgets" 释放获取的 IPC 资源的错误应用程序,而且适用于所有应用程序。原因是 Android 大量使用 kill(app_pid, SIGKILL)
将系统资源从后台进程回收到用户刚刚启动的新进程。结果应用程序死了,没有机会执行拆卸。内核无法释放该 IPC 资源,因为它们可能以不可预测的方式被其他进程共享(与文件描述符和虚拟内存不同)。请记住 Android 主要在 resource-constrained 硬件上运行,因此某种此类资源重新排列是不可避免的。
更多背景是here。旧的 NDK 包包含此文档,但在某些时候它已被删除。
Android 上的 IPC 的替代方法通常包括 Binder
-based solutions. In native code you may use ashmem
,它为共享内存段提供接口。最新的平台版本向它公开 public API,请参阅 <android/sharedmem.h>
。但对于较旧的平台,您可以通过与 ashmem 驱动程序直接交互来实现类似的功能,请参阅 libcutils
来源。
最后您可能仍会使用管道、UNIX-domain 套接字和可能的命名管道(当然如果底层文件系统支持此类 inode)。