该指令是dalvik 和 art虚拟机的字节码指令,这个指令的第二个参数是一个方法索引(unsigned short类型,16位),通过索引指定要调用的方法;
在普通的hotspot虚拟机的invoke 指令不是这样的, 是通过符号(一个包含类名、方法名的字符串)指定要调用的方法的,在类加载的 链接过程 中,把符号链接换成实际的内存地址(在java 内存的方法区)。
方法索引是在将class文件转化成dex文件时产生的,保存在dex文件中,目的是为了加快 类加载 过程的链接过程,即把索引链接换成方法在内存中的地址。因为invoke指令 的 方法索引参数是一个unsigned short 类型,所以索引必须在
[0, 0xffff] 内,所以一个dex文件内的方法数最多是 65536 ,当然不包括jni 方法。
因为dex文件加载后会把索引换成实际的地址, 因此方法数的限制在虚拟机内是不存在的,虚拟机可以加载多个dex文件;这种限制只是在编译阶段生成dex文件时才会有。
解决的方法有两个,
一是修改字节码指令表,这个目前只能呵呵;
二是使工程生成多个dex文件,并能动态加载。目前新版的android原生支持加载多dex,旧版本需要使用multidex工具;