在调用声明为native
的Java方法时,JVM运行时必须执行哪些常规步骤?
HotSpot 1.8.0 JVM如何实现JNI函数调用?涉及哪些检查步骤(例如返回后未处理的异常?),JVM要执行哪些簿记(例如本地参考注册表?),以及在调用本机Java方法后控制在哪里?如果有人可以提供原生HotSpot 1.8.0代码中的入口点或重要方法,我也将不胜感激。
免责声明:我知道我可以自己阅读代码,但事先的解释有助于快速找到我的代码。此外,我发现这个问题值得谷歌搜索。 ;)
答案 0 :(得分:35)
与简单的C函数调用相比,从Java调用JNI方法相当昂贵。 HotSpot通常执行以下大多数步骤来调用JNI方法:
JNIEnv*
和jclass
,并将其作为附加参数传递。method_entry
跟踪功能。synchronized
,则锁定对象监视器。in_java
切换到in_native
州。in_java
州。method_exit
。此程序的源代码可在SharedRuntime::generate_native_wrapper找到。
如您所见,开销可能很大。但在许多情况下,上述大部分步骤都不是必需的。例如,如果本机方法只对字节数组执行某些编码/解码,并且不抛出任何异常,也不会调用其他JNI函数。对于这些情况,HotSpot有一个名为Critical Natives
的非标准(并且未知)约定,讨论了here。