Thread.sleep()的Dalvik操作

Ric*_*rez 2 java android jvm dalvik smali

Dalvik的运作Thread.sleep(100);如下:

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

它是一个静态方法,只取一个参数,但给出两个参数:v2和v3.这不奇怪吗?有没有人对这种情况有所了解?

cyo*_*yon 5

不,它只需要一个长的参数.然而,长期使用两个寄存器传递 v2和v3.这是因为a long是64位值,因此它需要由Dalvik上的两个寄存器表示,它们将寄存器视为32位宽.Dalvik VM技术指南在字节码格式指南中提到:

当用于位值(例如整数和浮点数)时,寄存器被认为是32位宽.相邻的寄存器对用于64位值.寄存器对没有对齐要求.

您可以告诉静态方法long从方法签名中获取参数.这(J)V意味着它是一个接受longparameter(J)并返回void(V)的方法.

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