现在的位置: 首页 > 综合 > 正文

invokeNative_i386.S的分析小记

2013年10月23日 ⁄ 综合 ⁄ 共 1028字 ⁄ 字号 评论关闭

    这个函数将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。

抱歉!评论已关闭.