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

Linux大全评论570 views阅读模式

本文对Android framework层的API函数与其对应本地方法的映射、注册原理进行了介绍,通过本文,应该会对我们频繁调用的Android API的调用过程及实现原理有更加深入的认识。

我们知道,Android平台是Java、C/C++等多种混合语言写成的,我们在使用Android SDK提供的framework层的API来进行应用开发时通常调用的是Java方法,而实际上,这些Java API很多时候只是一个入口,方法功能的真正实现是通过JNI调用到framework层的native本地方法来实现的。比如,我们在使用Canvas的drawBitmap方法来绘制图片时,drawBitmap的真正实现就是通过JNI调用C++的同名方法来实现的。

下面,我们通过开机启动后本地方法的注册流程来具体的介绍Android API与对应本地方法究竟是如何关联起来的。

Android在开机启动后,经过一系列的加载流程,将进入\frameworks\base\cmds\ app_process\ App_main.cpp的main()方法,在main()方法中,会调用\frameworks\base\core\jni\AndroidRuntime.cpp的start()方法。事实上,Android API与本地方法的注册关联主要就是在AndroidRuntime.cpp模块里完成的。

在AndroidRuntime.cpp的start()方法中,会经过如下的调用流程,即:

void AndroidRuntime::start()  --->

void AndroidRuntime::start(const char* className, const bool startSystemServer) --->

int AndroidRuntime::startReg(JNIEnv* env)

其中,startReg函数主要就是用来进行函数注册的。我们深入到该函数内部,可以看到如下的代码片段:

  1. if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {  
  2.   
  3.         env->PopLocalFrame(NULL);  
  4.   
  5.         return -1;  
  6.   
  7.     }  

好了,流程介绍到这里,我们已经定位到了Android API与本地方法的注册关联的关键之处,实际上,API与本地方法的注册关键就是在此处完成的。标记为红色的register_jni_procs及其参数gRegJNI是注册关联的两大要素,下面我们对其分别作具体分析。

首先看gRegJNI的定义:

  1. static const RegJNIRec gRegJNI[] = {  
  2.   
  3.     REG_JNI(register_android_debug_JNITest),  
  4.   
  5.     REG_JNI(register_com_android_internal_os_RuntimeInit),  
  6.   
  7.     REG_JNI(register_android_os_SystemClock),  
  8.   
  9.     REG_JNI(register_android_util_EventLog),  
  10.   
  11.     REG_JNI(register_android_util_Log),  
  12.   
  13.     REG_JNI(register_android_util_FloatMath),  
  14.   
  15.     REG_JNI(register_android_text_format_Time),  
  16.   
  17.     REG_JNI(register_android_pim_EventRecurrence),  
  18.   
  19.     REG_JNI(register_android_content_AssetManager),  
  20.   
  21.     REG_JNI(register_android_content_StringBlock),  
  22.   
  23.     REG_JNI(register_android_content_XmlBlock),  
  24.   
  25.     REG_JNI(register_android_emoji_EmojiFactory),  
  26.   
  27.     REG_JNI(register_android_security_Md5MessageDigest),  
  28.   
  29.     REG_JNI(register_android_text_AndroidCharacter),  
  30.   
  31.     REG_JNI(register_android_text_AndroidBidi),  
  32.   
  33.     REG_JNI(register_android_text_KeyCharacterMap),  
  34.   
  35.     REG_JNI(register_android_os_Process),  
  36.   
  37.     REG_JNI(register_android_os_Binder),  
  38.   
  39.     REG_JNI(register_android_view_Display),  
  40.   
  41.     REG_JNI(register_android_nio_utils),  
  42.   
  43.     REG_JNI(register_android_graphics_PixelFormat),  
  44.   
  45.     REG_JNI(register_android_graphics_Graphics),  
  46.   
  47.     REG_JNI(register_android_view_Surface),  
  48.   
  49.     REG_JNI(register_android_view_ViewRoot),  
  50.   
  51.     REG_JNI(register_com_google_android_gles_jni_EGLImpl),  
  52.   
  53.     REG_JNI(register_com_google_android_gles_jni_GLImpl),  
  54.   
  55.     REG_JNI(register_android_opengl_jni_GLES10),  
  56.   
  57.     REG_JNI(register_android_opengl_jni_GLES10Ext),  
  58.   
  59.     REG_JNI(register_android_opengl_jni_GLES11),  
  60.   
  61.     REG_JNI(register_android_opengl_jni_GLES11Ext),  
  62.   
  63.     REG_JNI(register_android_opengl_jni_GLES20),  
  64.   
  65.    
  66.   
  67.     REG_JNI(register_android_graphics_Bitmap),  
  68.   
  69.     REG_JNI(register_android_graphics_BitmapFactory),  
  70.   
  71.     REG_JNI(register_android_graphics_BitmapRegionDecoder),  
  72.   
  73.     REG_JNI(register_android_graphics_Camera),  
  74.   
  75.     REG_JNI(register_android_graphics_Canvas),  
  76.   
  77.     REG_JNI(register_android_graphics_ColorFilter),  
  78.   
  79.     REG_JNI(register_android_graphics_DrawFilter),  
  80.   
  81.     REG_JNI(register_android_graphics_Interpolator),  
  82.   
  83.     REG_JNI(register_android_graphics_LayerRasterizer),  
  84.   
  85.     REG_JNI(register_android_graphics_MaskFilter),  
  86.   
  87.     REG_JNI(register_android_graphics_Matrix),  
  88.   
  89.     REG_JNI(register_android_graphics_Movie),  
  90.   
  91.     REG_JNI(register_android_graphics_NinePatch),  
  92.   
  93.     REG_JNI(register_android_graphics_Paint),  
  94.   
  95.     REG_JNI(register_android_graphics_Path),  
  96.   
  97.     REG_JNI(register_android_graphics_PathMeasure),  
  98.   
  99.     REG_JNI(register_android_graphics_PathEffect),  
  100.   
  101.     REG_JNI(register_android_graphics_Picture),  
  102.   
  103.     REG_JNI(register_android_graphics_PorterDuff),  
  104.   
  105.     REG_JNI(register_android_graphics_Rasterizer),  
  106.   
  107.     REG_JNI(register_android_graphics_Region),  
  108.   
  109.     REG_JNI(register_android_graphics_Shader),  
  110.   
  111.     REG_JNI(register_android_graphics_Typeface),  
  112.   
  113.     REG_JNI(register_android_graphics_Xfermode),  
  114.   
  115.     REG_JNI(register_android_graphics_YuvImage),  
  116.   
  117.     REG_JNI(register_com_android_internal_graphics_NativeUtils),  
  118.   
  119.    
  120.   
  121.     REG_JNI(register_android_database_CursorWindow),  
  122.   
  123.     REG_JNI(register_android_database_SQLiteCompiledSql),  
  124.   
  125.     REG_JNI(register_android_database_SQLiteDatabase),  
  126.   
  127.     REG_JNI(register_android_database_SQLiteDebug),  
  128.   
  129.     REG_JNI(register_android_database_SQLiteProgram),  
  130.   
  131.     REG_JNI(register_android_database_SQLiteQuery),  
  132.   
  133.     REG_JNI(register_android_database_SQLiteStatement),  
  134.   
  135.     REG_JNI(register_android_os_Debug),  
  136.   
  137.     REG_JNI(register_android_os_FileObserver),  
  138.   
  139.     REG_JNI(register_android_os_FileUtils),  
  140.   
  141.     REG_JNI(register_android_os_MessageQueue),  
  142.   
  143.     REG_JNI(register_android_os_ParcelFileDescriptor),  
  144.   
  145.     REG_JNI(register_android_os_Power),  
  146.   
  147.     REG_JNI(register_android_os_StatFs),  
  148.   
  149.     REG_JNI(register_android_os_SystemProperties),  
  150.   
  151.     REG_JNI(register_android_os_UEventObserver),  
  152.   
  153.     REG_JNI(register_android_net_LocalSocketImpl),  
  154.   
  155.     REG_JNI(register_android_net_NetworkUtils),  
  156.   
  157.     REG_JNI(register_android_net_TrafficStats),  
  158.   
  159.     REG_JNI(register_android_net_wifi_WifiManager),  
  160.   
  161.     REG_JNI(register_android_nfc_NdefMessage),  
  162.   
  163.     REG_JNI(register_android_nfc_NdefRecord),  
  164.   
  165.     REG_JNI(register_android_os_MemoryFile),  
  166.   
  167.     REG_JNI(register_com_android_internal_os_ZygoteInit),  
  168.   
  169.     REG_JNI(register_android_hardware_Camera),  
  170.   
  171.     REG_JNI(register_android_hardware_SensorManager),  
  172.   
  173.     REG_JNI(register_android_media_AudioRecord),  
  174.   
  175.     REG_JNI(register_android_media_AudioSystem),  
  176.   
  177.     REG_JNI(register_android_media_AudioTrack),  
  178.   
  179.     REG_JNI(register_android_media_JetPlayer),  
  180.   
  181.     REG_JNI(register_android_media_ToneGenerator),  
  182.   
  183.    
  184.   
  185.     REG_JNI(register_android_opengl_classes),  
  186.   
  187.     REG_JNI(register_android_bluetooth_HeadsetBase),  
  188.   
  189.     REG_JNI(register_android_bluetooth_BluetoothAudioGateway),  
  190.   
  191.     REG_JNI(register_android_bluetooth_BluetoothSocket),  
  192.   
  193.     REG_JNI(register_android_bluetooth_ScoSocket),  
  194.   
  195.     REG_JNI(register_android_server_BluetoothService),  
  196.   
  197.     REG_JNI(register_android_server_BluetoothEventLoop),  
  198.   
  199.     REG_JNI(register_android_server_BluetoothA2dpService),  
  200.   
  201.     REG_JNI(register_android_server_Watchdog),  
  202.   
  203.     REG_JNI(register_android_message_digest_sha1),  
  204.   
  205.     REG_JNI(register_android_ddm_DdmHandleNativeHeap),  
  206.   
  207.     REG_JNI(register_android_backup_BackupDataInput),  
  208.   
  209.     REG_JNI(register_android_backup_BackupDataOutput),  
  210.   
  211.     REG_JNI(register_android_backup_FileBackupHelperBase),  
  212.   
  213.     REG_JNI(register_android_backup_BackupHelperDispatcher),  
  214.   
  215.       
  216.   
  217.     REG_JNI(register_android_app_NativeActivity),  
  218.   
  219.     REG_JNI(register_android_view_InputChannel),  
  220.   
  221.     REG_JNI(register_android_view_InputQueue),  
  222.   
  223.     REG_JNI(register_android_view_KeyEvent),  
  224.   
  225.     REG_JNI(register_android_view_MotionEvent),  
  226.   
  227.    
  228.   
  229.     REG_JNI(register_android_content_res_ObbScanner),  
  230.   
  231.     REG_JNI(register_android_content_res_Configuration),  
  232.   
  233. };  

可以看到,gRegJNI是一个静态对象数组,这个对象数组实际上存储了Android framework中所有具有本地方法的java API模块的注册信息。为了理解这个RegJNIRec类型的静态数组,我们先看REG_JNI预编译宏和RegJNIRec类型的定义:

  1. #ifdef NDEBUG  
  2.   
  3.     #define REG_JNI(name)      { name }  
  4.   
  5.     struct RegJNIRec {  
  6.   
  7.         int (*mProc)(JNIEnv*);  
  8.   
  9.     };  
  10.   
  11. #else  
  12.   
  13.     #define REG_JNI(name)      { name, #name }  
  14.   
  15.     struct RegJNIRec {  
  16.   
  17.         int (*mProc)(JNIEnv*);  
  18.   
  19.         const char* mName;  
  20.   
  21.     };  
  22.   
  23. #endif  

显然,带参数的REG_JNII预编译宏实际上等价于一个“{name}”,而name是一个参数;而RegJNIRec类型实际上是一个包含函数指针的结构体类型。

这样,在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中:

  1. int register_android_graphics_Canvas(JNIEnv* env) {  
  2.   
  3.     int result;  
  4.   
  5.     REG(env, "android/graphics/Canvas", gCanvasMethods);  
  6.   
  7.     REG(env, "android/graphics/utils/BoundaryPatch", gBoundaryPatchMethods);  
  8.   
  9.     return result;  
  10.   
  11. }  

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

  1. #define REG(env, name, array) \  
  2.   
  3.     result = android::AndroidRuntime::registerNativeMethods(env, name, array, \  
  4.   
  5.                                         SK_ARRAY_COUNT(array));  \  
  6.   
  7.     if (result < 0return result  
  1. /* 
  2.  
  3.  * Register native methods using JNI. 
  4.  
  5.  */  
  6.   
  7. /*static*/ int AndroidRuntime::registerNativeMethods(JNIEnv* env,  
  8.   
  9.     const char* className, const JNINativeMethod* gMethods, int numMethods)  
  10.   
  11. {  
  12.   
  13.     return jniRegisterNativeMethods(env, className, gMethods, numMethods);  
  14.   
  15. }  

企鹅博客
  • 本文由 发表于 2019年9月6日 13:25:56
  • 转载请务必保留本文链接:https://www.qieseo.com/171512.html

发表评论