(入口一)字节码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方法调用的实现相关推荐

  1. JAVA方法调用中的解析与分派

    JAVA方法调用中的解析与分派 本文算是<深入理解JVM>的读书笔记,参考书中的相关代码示例,从字节码指令角度看看解析与分派的区别. 方法调用,其实就是要回答一个问题:JVM在执行一个方法 ...

  2. java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...

    最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中.奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制.本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内 ...

  3. java调用方法出现i 2a_性能-Java方法调用与使用变量

    性能-Java方法调用与使用变量 最近,我与团队负责人就使用临时变量与调用getter方法进行了讨论. 很长时间以来,我一直认为,如果我必须多次调用一个简单的getter方法,我会将其放入一个temp ...

  4. java方法调用之单分派与多分派(二)

    上篇博文java方法调用之重载.重写的调用原理(一) 讨论了重写与重载的实现原理,这篇博文讨论下单分派与多分派. 单分派.多分派 方法的接收者和方法的参数统称为方法的宗量. 根据分派基于宗量多少(接收 ...

  5. 揭密 Java方法调用的底层原理

    关注公众号"java后端技术全栈" 回复"000"获取优质面试资料 大家好,我是老田,今天来和大家聊聊Java方法调用的底层原理. 我们在日常开发中,其实很少去 ...

  6. java方法调用之动态调用多态(重写override)的实现原理——方法表

    转自:http://blog.csdn.net/fan2012huan/article/details/51007517 上两篇篇博文讨论了java的重载(overload)与重写(override) ...

  7. java 方法调用绑定

    将一个方法调用同一个方法主体关联起来被称作绑定.若在程序执行前进行绑定(由编译器和连接器实现),叫做前期绑定.读者可能从来没有听说过这个术语,因为它在面向过程语言中不需要选择就默认的绑定方式.例如C语 ...

  8. java方法中与参数怎么调用_与Java方法调用中的类型参数有关的问题

    Java 8的Java语言规范在"示例4.11-1.类型的用法"中提供了一个带有类型实参的方法调用示例: void loop(S s) { this.loop(s); // is ...

  9. jsp java方法调用_jsp怎么调用java方法

    jsp调用java的方法:首先在JSP页面中引入Java方法所在的包:然后在页面中编写[]并保存运行即可. 其实非常简单,因为在jsp中可以直接进行Java程序的编写,所以调用Java的方法只需一点点 ...

最新文章

  1. 2015大型互联网公司校招都开始了,薪资你准备好了嘛?
  2. Sql Server Management Studio 18 打开闪退问题
  3. 我理解Docker的过程2
  4. Java项目几个月能完成_c#项目转JAVA,第5个月,基本完成
  5. [TJOI2019]唱、跳、rap和篮球(指数型生成函数+NTT+卷积)
  6. LeetCode-1208:尽可能使字符串相等
  7. 在Mac上将WebP图像批量转换为JPG的方法
  8. android 加载过程,Android View (2) View的加载过程
  9. 毕业设计别再做 XX 管理系统了!!!
  10. Power Analysis估算样本容量
  11. 南华大学计算机学院足球队,南华大学大学生足球联赛电气首战
  12. 手把手教你成为Shader编程实战达人—GPU
  13. Python 使用xlsxwriter绘制Excel表格
  14. XTP界面在Dialog里的实现
  15. 什么是数据资产管理?5个角度帮你参透数据资产管理
  16. C#海伦公式三边计算三角形面积
  17. 一张纸还能上天能救命?理工男宁愿放弃NASA百万年薪,也要回家折纸?!
  18. Hadoop hdfs Shell命令 HDFS操作命令
  19. 自定义View之小球自由落体弹跳加载控件
  20. 四川铺管家:拼多多视频一般是多长的

热门文章

  1. TextView 显示内容时出现 ArrayIndexOutOfBoundsException 的解决方法(Android 4.1)
  2. Eclipse中如何修改SVN的地址
  3. HDU 1175 连连看
  4. 如何做到长时间(4 个小时以上)精神专注?
  5. PHP高效的敏感词过滤方法
  6. (转).NET框架下使用双缓冲技术绘图
  7. 多域环境下people picker查找不到用户问题的解决(转载jianyi)
  8. [导入]博客搬家了,呵呵
  9. C++学习基础七——深复制与浅复制
  10. 合唱队(最长子序列问题)