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() 检测是否空闲 工具方法(较少用)

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