dalvik对于Java方法调用的实现
(入口一)字節碼OP_INVOKE_ (匯編實現)
1.dvmResolveMethod:(C函數)決議方法的Method :方法名字字符串找ClassObject中Method
2.(設置調用環境)創建一個方法調用棧幀(設置參數)
3.分支----(匯編)
->本地方法:nativeFunc(C函數)
? ?...........
? ?...........
->Java方法:(1)設置interpState(字節碼)初始執行環境
? ? (2)跳轉執行: 取(被調方法)下一字節碼
算偏移,跳轉
Get__MethodID:決議出方法的Method:方法名字字符串查ClassObject中Method
(入口二) JNI->CallXXXMethod-> (啟動類的main方法通過JNI調用)
(dvm內部)直接調用 ?->?
dvmCallMethodV(Thread*, Method*, Object*,?JValue*, va_list args); (C實現)
?
1.(設置調用環境)創建一個方法調用棧幀(設置參數)
2.分支
->本地方法:(*method->nativeFunc) (self->curFrame,pResult, method, self)
(1).(第一次調用)決議時先查找本地函數指針,再調用
(1).查找類庫的本地函數表中的Dalvik本地函數
類庫本地函數格式:static void?XXX(const u4* args,JValue* pResult,const Method* method,Thread* self);
(一般Java程序的最終內部實現,用戶透明)直接調用VM的本地函數
(2).查找已加載的本地庫(dll/so)中標準JNI函數
標準JNI函數聲明格式:JNIExport?jRetVal?JNICall ?Java_ClassName_NativeMethodName(JNIEnv*, jobject,?...);
DLL中的本地函數可以通過JNI接口與VM交互(調用VM的本地函數)
(frameworks類的本地方法):加載類時已找到本地函數指針(注冊此類的所有JNI函數到Method)
(2).通過JNI的調用橋(call bridge)調用JNI函數?
(1)根據JNI函數的格式[即ABI標準(EABI-ARM/ABI-x86/FFI標準)]設置參數(寄存器/棧)
(2)調用本地函數???
(3)設置返回值(java對象)
?
->Java方法:dvmInterpret(Thread*, Method*, JValue* )
(1)設置interpState(字節碼)初始執行環境
(2)進入口函數dvmMterpStdRun
(兩種Java字節碼執行機制)
1.C版的Switch-Case機制:
?
while (true) {
? ? ? ? u2 inst = pc[0];取下一字節碼
? ? ? ? Handler handler = (Handler) gDvmMterpHandlers[inst & 0xff];查表(找到相應的)處理函數
? ? ? ? (*handler)(glue);調用處理函數
? ? }
2.匯編版的跳轉線性執行(Threaded execution):每一個字節碼對應匯編指令都占64字節,并按字節碼順序依次排列
每個字節碼執行完后/第一個字節碼
FETCH_ADVANCE_INST:取下一字節碼
GET_INST_OPCODE
GOTO_OPCODE(ip):跳到下一字節碼的匯編指令-根據字節碼算出偏移(單位64)再跳轉
?
跳轉執行(少去了Switch-Case中的循環)便于指令流水線,更加快速,但每個字節碼得匯編指令都占64字節會浪費空間
?
總結
以上是生活随笔為你收集整理的dalvik对于Java方法调用的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CRT 入口函数 CRTStartup
- 下一篇: 基于栈和基于寄存器的Java虚拟机