接着上一篇日志,先回顾下Java主函数调用时必须执行的call_stub函数:
static CallStub call_stub()
{
return (CallStub)(castable_address(_call_stub_entry);
}
castable_address是一个函数,展开后返回的是address_word类型,其最终原型就是unsigned int,_call_stub_entry也是unsigned int类型,指向了某个内存地址。返回值最终会被类型转换为CallStub类型的函数指针,总的来说,call_stub()函数的调用逻辑就是,在JVM初始化时,便会让_call_stub_entry(unsigned int类型) 指向某一内存区域,接着类型转换成CallStub自定义的函数指针,最后返回,JVM将call_stub()的返回值函数指针作为函数调用。CallStub的结构上一篇日志有写,一个有八个参数,其中result_val_address返回值地址,result_type返回值类型和size_of_parameters入参数量,这些比较简单,而link连接器、Java方法对象method()、调用Java方法的入口函数entry_point以及方法参数集合parameters等对于JVM调用Java方法来说十分重要。
link连接器
先来看看link类