深入探讨虚拟机运行时的java线程栈帧、Java/JVM沟通(4)
2023-04-29 来源:飞速影视
在JDK源码中,有很多类(如java.lang.Class,java.lang.Object, java.lang.System)都有这个注册函数,它们都是在一个类的静态代码块里面调用registerNatives。这也意味着如果类没有经历初始化阶段(即<clinit>没有调用,参见第2章),部分未经注册的JNI函数是不能使用的。在第2章提到,Java方法在虚拟机中的表示是Method,Method里面有很多入口,而所谓注册,就是设置native方法的入口,如代码清单4-18所示,只是这个入口位置比较奇怪,不在Method中而是在其后。
代码清单4-18 native方法入口
void Method::set_native_function(...) {// native_function_addr会返回Method之后的位置address* native_function = native_function_addr();address current = *native_function;// 如果已经注册过就返回if (current == function) return;// 否则将native方法入口地址写到Method之后的位置*native_function = function;}set_native_function会将JNI函数地址写到Method后的native_function_addr,如图4-7所示。
如果是普通Java方法,Method就存放一切需要的入口地址,比如解释器入口地址、JIT编译后的入口地址,此时Method后面没有附加内容。但是如果Java方法是native,其对应的JNI函数地址会放到Method后面的第一个附加槽(不属于Method数据结构的部分),这个“将JNI函数地址放入第一个槽”就是registerNative()要完成的。这样之后registerNative注册的native方法就能在类初始化后被调用了。
本站仅为学习交流之用,所有视频和图片均来自互联网收集而来,版权归原创者所有,本网站只提供web页面服务,并不提供资源存储,也不参与录制、上传
若本站收录的节目无意侵犯了贵司版权,请发邮件(我们会在3个工作日内删除侵权内容,谢谢。)
www.fs94.org-飞速影视 粤ICP备74369512号