在創(chuàng)建Dalvik虛擬機的過程中,會調(diào)用dvmCreateJNIEnv()函數(shù)為當前進程的主線程配置運行環(huán)境,初始化可能會調(diào)用的原生方法相關的初始化配置位于gNativeInterface變量中。在配置好運行環(huán)境后,接著就調(diào)用dvmStartup()函數(shù)創(chuàng)建Dalvik虛擬機,并完成相關組件如內(nèi)存跟蹤器(Alloc-Tracker)、垃圾回收器(Garbage Collector)、主線程、DEX優(yōu)化器(DEX optimizer)、Dalvik類校驗器(Dalvik classfile verification)、緩沖(1024bit)、bootstrap 類加載器(bootstrap class loader)、java.lang.Thread等線程,java.lang.Thread等異常類、Hash表、原生代碼加載器(native code loader)、Dalvik原生類(gDvmNativeMethodSet)、java JNI、java/lang/reflect/AccessibleObject等映射類,Profile等。
注冊原生方法的過程主要是通過AndroidRuntime::startReg()在AndroidRuntime:: register_jni_procs()中完成的。注冊原生方法的具體過程如下:
代碼1-1 注冊原生方法
static const RegJNIRec gRegJNI[]={
REG_JNI(register_android_debug_JNITest),
REG_JNI(register_com_android_internal_os_RuntimeInit),
REG_JNI(register_android_os_SystemClock), //系統(tǒng)時鐘
REG_JNI(register_android_util_EventLog), //事件日志
REG_JNI(register_android_util_Log), //調(diào)試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_KeyCharacterMap), //按鍵映射
REG_JNI(register_android_os_Process),
REG_JNI(register_android_os_Binder), //IBinder通信
REG_JNI(register_android_os_Hardware),
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), //OpenGL ES
REG_JNI(register_com_google_android_gles_jni_GLImpl),
REG_JNI(register_android_graphics_Bitmap), //2D圖像
REG_JNI(register_android_graphics_BitmapFactory),
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), // 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_com_android_internal_graphics_NativeUtils),
REG_JNI(register_android_database_CursorWindow),
REG_JNI(register_android_database_SQLiteDatabase), //SQL
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_Exec),
REG_JNI(register_android_os_FileObserver), //文件系統(tǒng)
REG_JNI(register_android_os_FileUtils),
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), //網(wǎng)絡管理
REG_JNI(register_android_net_wifi_WifiManager), //WIFI管理器
REG_JNI(register_android_os_MemoryFile),
REG_JNI(register_com_android_internal_os_ZygoteInit), //Zygote虛擬機
REG_JNI(register_android_hardware_Camera),
REG_JNI(register_android_hardware_SensorManager), //傳感器管理器
REG_JNI(register_android_media_AudioRecord), // AudioRecord
REG_JNI(register_android_media_AudioSystem), // AudioSystem
REG_JNI(register_android_media_AudioTrack), // AudioTrack
REG_JNI(register_android_media_JetPlayer),
REG_JNI(register_android_media_ToneGenerator),
REG_JNI(register_android_opengl_classes), //3D渲染
REG_JNI(register_android_bluetooth_Database), //BT
REG_JNI(register_android_bluetooth_HeadsetBase),
REG_JNI(register_android_bluetooth_BluetoothAudioGateway),
REG_JNI(register_android_bluetooth_RfcommSocket),
REG_JNI(register_android_bluetooth_ScoSocket),
REG_JNI(register_android_server_BluetoothDeviceService),
REG_JNI(register_android_server_BluetoothEventLoop),
REG_JNI(register_android_server_BluetoothA2dpService),
REG_JNI(register_android_message_digest_sha1),
REG_JNI(register_android_ddm_DdmHandleNativeHeap),
REG_JNI(register_android_util_Base64),
REG_JNI(register_android_location_GpsLocationProvider),
};
這些原生方法均為Java與底層原生服務的接口,只有對原生方法進行注冊,Dalvik虛擬機才能具備利用底層原生服務的能力。