在创建Dalvik虚拟机的过程中,会调用dvmCreateJNIEnv()函数为当前进程的主线程配置运行环境,初始化可能会调用的原生方法相关的初始化配置位于gNativeInterface变量中。在配置好运行环境后,接着就调用dvmStartup()函数创建Dalvik虚拟机,并完成相关组件如内存跟踪器(Alloc-Tracker)、垃圾回收器(Garbage Collector)、主线程、DEX优化器(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), //系统时钟
REG_JNI(register_android_util_EventLog), //事件日志
REG_JNI(register_android_util_Log), //调试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), //文件系统
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), //网络管理
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虚拟机才能具备利用底层原生服务的能力。