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

本文对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函数主要就是用来进行函数注册的。我们深入到该函数内部,可以看到如下的代码片段:

if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {              env->PopLocalFrame(NULL);              return -1;          }  

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

首先看gRegJNI的定义:

static const RegJNIRec gRegJNI[] = {          REG_JNI(register_android_debug_JNITest),          REG_JNI(register_com_android_internal_os_RuntimeInit),          REG_JNI(register_android_os_SystemClock),          REG_JNI(register_android_util_EventLog),          REG_JNI(register_android_util_Log),          REG_JNI(register_android_util_FloatMath),          REG_JNI(register_android_text_format_Time),          REG_JNI(register_android_pim_EventRecurrence),          REG_JNI(register_android_content_AssetManager),          REG_JNI(register_android_content_StringBlock),          REG_JNI(register_android_content_XmlBlock),          REG_JNI(register_android_emoji_EmojiFactory),          REG_JNI(register_android_security_Md5MessageDigest),          REG_JNI(register_android_text_AndroidCharacter),          REG_JNI(register_android_text_AndroidBidi),          REG_JNI(register_android_text_KeyCharacterMap),          REG_JNI(register_android_os_Process),          REG_JNI(register_android_os_Binder),          REG_JNI(register_android_view_Display),          REG_JNI(register_android_nio_utils),          REG_JNI(register_android_graphics_PixelFormat),          REG_JNI(register_android_graphics_Graphics),          REG_JNI(register_android_view_Surface),          REG_JNI(register_android_view_ViewRoot),          REG_JNI(register_com_google_android_gles_jni_EGLImpl),          REG_JNI(register_com_google_android_gles_jni_GLImpl),          REG_JNI(register_android_opengl_jni_GLES10),          REG_JNI(register_android_opengl_jni_GLES10Ext),          REG_JNI(register_android_opengl_jni_GLES11),          REG_JNI(register_android_opengl_jni_GLES11Ext),          REG_JNI(register_android_opengl_jni_GLES20),                 REG_JNI(register_android_graphics_Bitmap),          REG_JNI(register_android_graphics_BitmapFactory),          REG_JNI(register_android_graphics_BitmapRegionDecoder),          REG_JNI(register_android_graphics_Camera),          REG_JNI(register_android_graphics_Canvas),          REG_JNI(register_android_graphics_ColorFilter),          REG_JNI(register_android_graphics_DrawFilter),          REG_JNI(register_android_graphics_Interpolator),          REG_JNI(register_android_graphics_LayerRasterizer),          REG_JNI(register_android_graphics_MaskFilter),          REG_JNI(register_android_graphics_Matrix),          REG_JNI(register_android_graphics_Movie),          REG_JNI(register_android_graphics_NinePatch),          REG_JNI(register_android_graphics_Paint),          REG_JNI(register_android_graphics_Path),          REG_JNI(register_android_graphics_PathMeasure),          REG_JNI(register_android_graphics_PathEffect),          REG_JNI(register_android_graphics_Picture),          REG_JNI(register_android_graphics_PorterDuff),          REG_JNI(register_android_graphics_Rasterizer),          REG_JNI(register_android_graphics_Region),          REG_JNI(register_android_graphics_Shader),          REG_JNI(register_android_graphics_Typeface),          REG_JNI(register_android_graphics_Xfermode),          REG_JNI(register_android_graphics_YuvImage),          REG_JNI(register_com_android_internal_graphics_NativeUtils),                 REG_JNI(register_android_database_CursorWindow),          REG_JNI(register_android_database_SQLiteCompiledSql),          REG_JNI(register_android_database_SQLiteDatabase),          REG_JNI(register_android_database_SQLiteDebug),          REG_JNI(register_android_database_SQLiteProgram),          REG_JNI(register_android_database_SQLiteQuery),          REG_JNI(register_android_database_SQLiteStatement),          REG_JNI(register_android_os_Debug),          REG_JNI(register_android_os_FileObserver),          REG_JNI(register_android_os_FileUtils),          REG_JNI(register_android_os_MessageQueue),          REG_JNI(register_android_os_ParcelFileDescriptor),          REG_JNI(register_android_os_Power),          REG_JNI(register_android_os_StatFs),          REG_JNI(register_android_os_SystemProperties),          REG_JNI(register_android_os_UEventObserver),          REG_JNI(register_android_net_LocalSocketImpl),          REG_JNI(register_android_net_NetworkUtils),          REG_JNI(register_android_net_TrafficStats),          REG_JNI(register_android_net_wifi_WifiManager),          REG_JNI(register_android_nfc_NdefMessage),          REG_JNI(register_android_nfc_NdefRecord),          REG_JNI(register_android_os_MemoryFile),          REG_JNI(register_com_android_internal_os_ZygoteInit),          REG_JNI(register_android_hardware_Camera),          REG_JNI(register_android_hardware_SensorManager),          REG_JNI(register_android_media_AudioRecord),          REG_JNI(register_android_media_AudioSystem),          REG_JNI(register_android_media_AudioTrack),          REG_JNI(register_android_media_JetPlayer),          REG_JNI(register_android_media_ToneGenerator),                 REG_JNI(register_android_opengl_classes),          REG_JNI(register_android_bluetooth_HeadsetBase),          REG_JNI(register_android_bluetooth_BluetoothAudioGateway),          REG_JNI(register_android_bluetooth_BluetoothSocket),          REG_JNI(register_android_bluetooth_ScoSocket),          REG_JNI(register_android_server_BluetoothService),          REG_JNI(register_android_server_BluetoothEventLoop),          REG_JNI(register_android_server_BluetoothA2dpService),          REG_JNI(register_android_server_Watchdog),          REG_JNI(register_android_message_digest_sha1),          REG_JNI(register_android_ddm_DdmHandleNativeHeap),          REG_JNI(register_android_backup_BackupDataInput),          REG_JNI(register_android_backup_BackupDataOutput),          REG_JNI(register_android_backup_FileBackupHelperBase),          REG_JNI(register_android_backup_BackupHelperDispatcher),                    REG_JNI(register_android_app_NativeActivity),          REG_JNI(register_android_view_InputChannel),          REG_JNI(register_android_view_InputQueue),          REG_JNI(register_android_view_KeyEvent),          REG_JNI(register_android_view_MotionEvent),                 REG_JNI(register_android_content_res_ObbScanner),          REG_JNI(register_android_content_res_Configuration),      };  

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

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