这个函数将Java的Native函数调用转换为C函数调用,Java虚拟机将所有的参数传递到
Java堆栈中,并且期望返回的结果放置在同样的地方。因此,就必须把Java堆栈中的
参数拷贝到C堆栈中(或者寄存器),并且将函数的返回值在拷贝回Java堆栈中。
这样的过程产生的性能损失很小,但是这样的处理方式却避免了为每一个Native函数来
生称一个存根。
x86处理器所有的参数都被传递到了堆栈中,而且返回的浮动指针结果到STO,其中32bit
的结果放到eax中,64bit的结果放置到eax和edx中
CVMjniInvokeNative的第一个参数是指向JNI环境的指针,这个指针会不经修改作为第一
个传递给本地函数的参数。
第二个参数参数是指向"实际"的Native函数的指针
第三个参数(stk)是指向Java堆栈的指针,指向的地址存放着所有的参数(比如stk[0],
stk[1],...)。
第四个参数是Native函数的简洁的"署名",基本上是由所有的对象的很长的署名缩合而
成,大小是1byte,这以后他们被被捕加区分的对待。这使得对其解析的过程变得简单
快速。详细的情况可以参看classload.c 和 classruntime.c 。
第五个参数是Java堆栈中所有参数的总大小(以32bit的字为单位,即JavaVM中的cell)
注意,Java堆栈并没有任何边界对齐的要求。参数在堆栈中是一字或者双字的形式连
续存放的。如果Native函数不是类函数的话,那么还将包括了"this"指针。
第六个参数对于非静态的Native函数来说是0,对于静态函数就是jclass。非静态Native
函数的第二个参数就是Native方法所属对象实例的引用(传递到Java对栈中是stk[0])。
所以对非静态的函数,真正的参数是从stk[1]开始的。静态Native方法的第二个参数是
Native方法所属类的指针。
Native方法的返回值会以字为单位被放置到stk[0]中或者以双字为单位放置到stk[0]和
stk[1]中。如果Native函数的返回类形是void的话CVMjniInvokeNative将返回0值。返回
一个字的话就是1,两个字就是2,如果返回一个对象实例则返回-1。