box*_*box 16 java java-native-interface jvm
在调用声明为的Java方法时,JVM运行时必须执行的常规步骤是native什么?
HotSpot 1.8.0 JVM如何实现JNI函数调用?涉及哪些检查步骤(例如返回后未处理的异常?),JVM要执行哪些簿记(例如本地参考注册表?),以及在调用本机Java方法后控制在哪里?如果有人可以提供本机HotSpot 1.8.0代码的入口点或重要方法,我也将不胜感激.
免责声明:我知道我可以自己阅读代码,但事先的解释有助于快速找到我的代码.此外,我发现这个问题值得谷歌搜索.;)
apa*_*gin 36
与简单的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,在此讨论.