java层Looper对象内部有一个类型为MessageQueue的成员变量mQueue,指向一个MessageQueue对象,C++层每个NativeMessageQueue对象内部有个类型为Looper的成员变量mLooper,指向C++层的Looper对象。
java层中的每个MQ对象都有一个类型为long的成员变量mPtr,它保存了C++层中的NativeMessageQueue对象的地址值。这样就可以将java层中的MQ对象与C++层中的NativeMQ对象关联起来。
java层中的每个MQ对象还有一个类型为Message的成员变量mMessages,它用来描述消息,通过调用MQ类的成员函数enqueueMessage来往里面添加消息
C++层中的Looper对象有两个类型为int的成员变量mWakeReadPipeFd和mWakeWritePipeFd,分别描述管道的读端文件描述符和写端文件描述符。当线程的消息队列没有消息处理时,线程会在这个管道的读端文件描述符上进行睡眠等待,直到其他线程通过这个管道的写端文件描述符来唤醒线程为止。
调用java层的Looper类的静态成员函数prepareMainLooper或者prepare来为线程创建消息队列时,java层的Looper类就会在这个线程中创建Looper对象和MQ对象。在创建java层的MQ对象的过程中,又会通过MQ类的成员变量mPtr调用MQ类的成员函数nativeInit,在C++层中创建一个NativeMessageQueue对象和一个Looper对象。在创建C++层的Looper对象时,又会创建一个管道,这个管道的读端文件描述符和写端文件描述符就保存在该管道的成员变量mWakeReadPipeFd和mWakeWritePipeFd中。

