7.2.4 NativeMessageQueue关联到MessageQueue
将NativeMessageQueue与Java层的MessageQueue关联的过程由方法android_os_Message Queue_setNativeMessageQueue完成,该方法位于android_os_MessageQueue.cpp中,代码如下:
static void android_os_MessageQueue_setNativeMessageQueue(JNIEnv*env,
jobject messageQueueObj, NativeMessageQueue*nativeMessageQueue){
/*SetIntField是JNI层向Java传输数据的方法,这里将nativeMessageQueue
的地址保存到Java层MessageQueue对象的mPtr成员变量中/
env->SetIntField(messageQueueObj, gMessageQueueClassInfo.mPtr,
reinterpret_cast<jint>(nativeMessageQueue));
}
gMessageQueueClassInfo是一个结构体,定义于frameworks/base/core/jni/android_os_Message-Queue.cpp中,代码如下:
static struct{
jfieldID mPtr;//native object attached to the DVM MessageQueue
}gMessageQueueClassInfo;
gMessageQueueClassInfo的mPtr是jfieldID类型的变量,在JNI中,jfieldID表示Java层成员变量的名字,因此这里指代Java层MessageQueue对象的mPtr成员变量。
综上所述,android_os_MessageQueue_setNativeMessageQueue函数的作用是,将Native层的NativeMessageQueue和Java层的Message-Queue做一个关联。在Java层中,可以通过mPtr成员变量访问Native层的NativeMessageQueue对象。
至此,Native层的工作已经结束了,程序返回到Java层的Looper.prepare()方法。此时,Java层的Looper持有当前线程的引用,并在其内部持有一个MessageQueue对象。
NativeMessageQueue与Java层的MessageQueue的关联关系如图7-2所示。
图 7-2 NativeMessageQueue与MessageQueue的关联关系