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 生命周期同步

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器