MessageQueue和NativeMessageQueue的关系
MessageQueue 和 NativeMessageQueue 的关系可以概括为:
Java 层的 MessageQueue 是应用层的消息管理类,而其底层真正处理消息阻塞等待与唤醒等核心功能的,是 NativeMessageQueue。
它们之间通过 JNI 连接,形成了一个分层架构。
一、类的结构关系图
Java层:
android.os.MessageQueue
└── nativeInit()、nativePollOnce()、nativeWake() 等 JNI 方法
↓
Native层:
android::NativeMessageQueue
└── 封装了 android::Looper
二、Java 层的MessageQueue
位于:
frameworks/base/core/java/android/os/MessageQueue.java
主要功能:
管理 Message 列表(通过 Message 的 next 指针组成链表);
提供 enqueueMessage()、next() 等 API;
通过 JNI 与 Native 层通信,例如:
nativeInit()
nativePollOnce()
nativeWake()
这些方法在 MessageQueue 的构造中调用,用来初始化底层机制。
三、Native 层的NativeMessageQueue
位于:
frameworks/base/core/jni/android_os_MessageQueue.cpp
C++ 类定义大致如下:
class NativeMessageQueue {
public:
NativeMessageQueue();
~NativeMessageQueue();
sp<Looper> getLooper();
void pollOnce(int timeoutMillis);
void wake();
private:
sp<Looper> mLooper;
};
关键点:
- NativeMessageQueue 拥有一个 android::Looper 实例;
- 是 Java 层 MessageQueue 的 JNI 背后实体;
- 通过 nativePollOnce() 使用 Looper::pollOnce() 等待事件;
- 通过 nativeWake() 唤醒 Looper。
四、两者的连接方式:JNI
在 android_os_MessageQueue.cpp 中注册了 JNI:
static const JNINativeMethod gMessageQueueMethods[] = {
{ "nativeInit", "()J", (void*)android_os_MessageQueue_nativeInit },
{ "nativePollOnce", "(JI)V", (void*)android_os_MessageQueue_nativePollOnce },
{ "nativeWake", "(J)V", (void*)android_os_MessageQueue_nativeWake },
};
- nativeInit() 创建 NativeMessageQueue 实例,并返回其地址(jlong)作为 Java 层 mPtr;
- 后续 Java 调用 nativePollOnce(mPtr),Native 层使用 reinterpret_cast 拿回指针,调用对应函数。
五、调用流程示意图
Java
↓
MessageQueue.next() ← 获取下一个消息(阻塞)
↓
nativePollOnce(mPtr, ...) ← 调用 JNI
↓
NativeMessageQueue::pollOnce() ← Looper::pollOnce()
↓
epoll_wait(...) ← 等待事件或定时器
六、总结对比
项目 | **Java 层 **MessageQueue | **Native 层 **NativeMessageQueue |
---|---|---|
层级 | Java | C++(JNI) |
职责 | 管理 Message、派发给 Handler | 等待/唤醒消息、封装 epoll 和 Looper |
内部依赖 | 无 | android::Looper(epoll 管理) |
唤醒机制 | nativeWake() | 调用 Looper::wake() |
轮询机制 | nativePollOnce() | 调用 Looper::pollOnce()(阻塞式等待) |
生命周期 | 与线程绑定 | 与 Java MessageQueue 生命周期同步 |