从别人的一篇文章里面扣的,放这里备查
原始类型
- V void (只能用于返回值类型)
- Z boolean
- B byte
- S short
- C char
- I int
- J long
- F float
- D Double
对象类型
- Lpackage/name/ObjectName; 相当于java中的package.name.ObjectName
L 表示这是一个对象类型
package/name 该对象所在的包
ObjectName 对象名称
; 标识对象名称的结束
数组的表示
[I 表示一个int型的一维数组,相当于int[];
增加一个维度增加一个[,如[[I表示int[][]
数组每一个维度最多255个;
对象数组表示也是类似,如String数组的表示是[Ljava/lang/String
寄存器与变量
java中变量都是存放在内存中的,android为了提高性能,变量都是存放在寄存器中的,寄存器为32位,可以支持任何类型,其中long和double是64为的,需要使用两个寄存器保存。
寄存器采用v和p来命名
v表示本地寄存器,p表示参数寄存器,关系如下
如果一个方法有两个本地变量,有三个参数
- v0 第一个本地寄存器
- v1 第二个本地寄存器
- v2 p0 (this)
- v3 p1 第一个参数
- v4 p2 第二个参数
- v5 p3 第三个参数
当然,如果是静态方法的话就只有5个寄存器了,不需要存this了。
.registers 使用这个指令指定方法中寄存器的总数
.locals 使用这个指定表明方法中非参寄存器的总数,放在方法的第一行。