深入探讨虚拟机运行时的java线程栈帧、Java/JVM沟通(3)

2023-04-29 来源:飞速影视

深入探讨虚拟机运行时的java线程栈帧、Java/JVM沟通


有时Java标准库不提供或者没有及时提供平台特定的一些功能,有时有些库可能使用其他语言编写,但Java代码希望调用它们,还有时用户希望使用汇编或者其他的低级语言实现一些时间敏感的逻辑。为了满足这些需求,Java设计了JNI(Java Native Interface)。当Java方法被native关键字修饰时(native方法),该方法通过JNI进入虚拟机内部,调用对应的虚拟机中函数(JNI函数)。
JNI
开发者通常使用Class<?>.getDeclaredFields()获取某类的所有(父类除外)字段。在具体实现中,它调用native修饰的方法getDeclaredFields0,该方法又通过JNI调用虚拟机内部的JNI函数JVM_GetClassDeclaredFields。那么虚拟机如何知道native方法getDeclaredFields0对应的JNI函数JVM_GetClassDeclaredFields呢?答案是使用Class<?>.registerNatives。
当类加载时,虚拟机调用静态代码块的Class<?>.registerNatives方法,如代码清单4-17所示,该方法会告诉虚拟机两者的对应关系。后续如果调用getDeclaredFields0,虚拟机可以根据之前注册的关系找到JVM_GetClassDeclaredFields。
代码清单 4-17 Class.getDeclaredFields()的JNI实现
static JNINativeMethod methods[] = {{"getDeclaredFields0","(Z)[" FLD,(void *)&JVM_GetClassDeclaredFields}, ...};JNIEXPORT void JNICALLJava_java_lang_Class_registerNatives(JNIEnv *env, jclass cls){methods[1].fnPtr = (void *)(*env)->GetSuperclass;(*env)->RegisterNatives(env, cls, methods,sizeof(methods)/sizeof(JNINativeMethod));}HotSpot VM将一些JNI函数放入一个数组(methods),然后用registerNatives统一注册。
相关影视
合作伙伴
本站仅为学习交流之用,所有视频和图片均来自互联网收集而来,版权归原创者所有,本网站只提供web页面服务,并不提供资源存储,也不参与录制、上传
若本站收录的节目无意侵犯了贵司版权,请发邮件(我们会在3个工作日内删除侵权内容,谢谢。)

www.fs94.org-飞速影视 粤ICP备74369512号