Android原理揭秘系列之framework本地方法注册(4)

这样,在gRegJNI[]数组中,一个数组元素“REG_JNI(register_android_debug_JNITest),”也就等价于“{register_android_debug_JNITest },”,而这种数组定义方式的含义实际上就是把register_android_debug_JNITest这个函数指针,作为该数组元素的初始化参数,即该数组元素的mProc指针指向register_android_debug_JNITest。也就是说,gRegJNI[]数组的每个RegJNIRec结构体元素对应了一个framework子模块的本地方法注册信息,这个注册信息是通过RegJNIRec结构体元素的mProc指针来存储的。

理解静态gRegJNI数组的含义非常重要,因为其直接定义了各个framework子模块本地方法的注册关联。

下面我具体来看下gRegJNI[]数组中每个结构体元素的mProc指针存储的函数指针究竟是什么,这个函数指针指向的函数是如何工作的。我们在gRegJNI[]数组中选取大家比较熟悉的Canvas相关的数组元素REG_JNI( register_android_graphics_Canvas)为例,看看register_android_graphics_Canvas的实现,该函数的实现在frameworks\base\core\jni\android\graphics\ Canvas.cpp中:

int register_android_graphics_Canvas(JNIEnv* env) {          int result;          REG(env, "android/graphics/Canvas", gCanvasMethods);          REG(env, "android/graphics/utils/BoundaryPatch", gBoundaryPatchMethods);          return result;      }  

其中REG是一个预编译宏,其定义是:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwzjjf.html