java - Thread.sleep() 的 Dalvik 操作

标签 java android jvm dalvik smali

Thread.sleep(100); 的 Dalvik 操作如下所示:

invoke-static {v2, v3}, Ljava/lang/Thread;.sleep:(J)V

这是一个静态方法,接受一个参数,但给出两个参数:v2 和 v3。是不是很奇怪? 有人知道这种情况吗?

最佳答案

不,它只需要一个很长的参数。然而,long 是使用两个寄存器 v2v3 传递的。这是因为 long 是一个 64 位值,因此它需要由 Dalvik 上的两个寄存器表示,Dalvik 认为寄存器是 32 位宽。 Dalvik VM 技术指南在 bytecode format guide 中提到了这一点:

When used for bit values (such as integers and floating point numbers), registers are considered 32 bits wide. Adjacent register pairs are used for 64-bit values. There is no alignment requirement for register pairs.

您可以看出静态方法从方法签名中获取一个 long 参数。 (J)V 表示它是一个接受long 参数(J)并返回void(V).

要阅读有关方法描述符的更多信息,请查看 JVM 规范,特别是 section-4.3.3section-4.3.2

关于java - Thread.sleep() 的 Dalvik 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19011263/

相关文章:

java - 为什么间接增量比直接增量快?

java - 为什么 java.lang.Object.getClass() (和反射)比平时慢?

java - Java项目中的信任边界违规缺陷

Java:如何检查 HashMap 键是否包含对象?

android - 应用插件 : 'android' or apply plugin: 'com.android.application'

android - 如何强制android :shape ="oval" to remain perfect circle?

android - 来自通知的 Activity 中收到错误的 Intent (在服务中)

java - 如何用 Java 编写正确的微基准测试?

java - "Autowire"部署spring模块化应用到tomcat后失败

java - 传递对象的自定义数组列表