MessageQueue中的native方法
MessageQueue 是 Android 消息机制的底层组件之一,和 Looper、Handler 配合实现了线程的消息循环。在 MessageQueue 中,有几个关键的 native 方法,这些方法用于与底层 epoll、pipe、eventfd 等机制交互,实现消息等待、唤醒、轮询等能力。
这些 native 方法对应的是 C++ 层的 Looper 和 MessageQueue 实现,具体在 android_os_MessageQueue.cpp 和 Looper.cpp 中。
MessageQueue 中的 native 方法汇总
// frameworks/base/core/java/android/os/MessageQueue.java
private native long nativeInit();
private native void nativeDestroy(long ptr);
private native void nativePollOnce(long ptr, int timeoutMillis);
private native void nativeWake(long ptr);
private native boolean nativeIsIdling(long ptr);
每个方法的含义与作用
1. nativeInit()
private native long nativeInit();
创建一个 native 层的 Looper 实例(android::Looper 对象);
返回一个 native 句柄(mPtr),保存在 Java 层;
这相当于启动 C++ 的消息轮询器。
// native 实现(Looper.cpp)
sp<Looper> Looper::prepare() {
return new Looper(…);
}
2. nativePollOnce(long ptr, int timeoutMillis)
private native void nativePollOnce(long ptr, int timeoutMillis);
是最核心的函数,用于等待消息到来;
阻塞当前线程直到:
- 有消息到达;
- 超时;
- 被 nativeWake() 唤醒;
相当于 Java 层的 MessageQueue.next() 调用消息轮询等待的核心操作。
实现中使用 epoll_wait() 或 poll() 等机制进行阻塞等待。
3. nativeWake(long ptr)
private native void nativeWake(long ptr);
唤醒因 nativePollOnce() 被阻塞的线程;
通常在新消息到来时调用,比如:
- Handler.sendMessage();
- 有外部事件触发;
实际上底层使用的是 eventfd 或 pipe 写入一个字节,让 epoll 立即返回。
4. nativeDestroy(long ptr)
private native void nativeDestroy(long ptr);
- 销毁 native 层的 Looper 对象,释放资源;
- 在 MessageQueue.quit() 中被调用;
- 避免资源泄露(特别是 file descriptor)。
5. nativeIsIdling(long ptr)
private native boolean nativeIsIdling(long ptr);
- 检查底层 Looper 是否处于空闲状态;
- 主要用于调试或性能分析,不是核心功能。
它们在 MessageQueue 中的调用流程关系图
┌─────────────┐
│ MessageQueue │
└─────────────┘
│
nativeInit() → 创建 native Looper (C++)
│
nativePollOnce() ← MessageQueue.next()
│
nativeWake() ← Handler.sendMessage()
│
nativeDestroy() ← quit()/dispose()
C++ 层关联文件(简要)
文件 | 作用 |
---|---|
android_os_MessageQueue.cpp | Java 和 C++ 交互桥梁,JNI 注册 |
Looper.cpp(android::Looper) | 核心事件轮询器,使用 epoll 实现 |
MessageQueue.cpp | 封装消息处理逻辑,与 Handler 协作 |
总结
方法 | 作用 | 用于 |
---|---|---|
nativeInit() | 初始化 native 层 Looper | MessageQueue 构造时 |
nativePollOnce() | 轮询等待消息 | MessageQueue.next() 主循环 |
nativeWake() | 唤醒阻塞线程 | enqueueMessage() 有新消息时 |
nativeDestroy() | 释放 native 资源 | quit() 退出时 |
nativeIsIdling() | 检测是否空闲 | 工具方法(较少用) |