[讨论] HotSpot VM里Java程序通过JNI调用C函数的流程

yuyinyang 2014-10-28
请问一下Java程序通过JNI调用C函数的这部分逻辑对应的HotSpot源码在哪?
从JVM进入native C函数的入口和JNI调用完成之后返回JVM的地方分别在哪?
RednaxelaFX 2014-10-29
分解释器版本和“编译”版本两种。

解释器版的实现方式是:解释器对native方法有特殊的入口,由这里生成:
http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/312b5f1dc31d/src/cpu/x86/vm/templateInterpreter_x86_64.cpp#l835
InterpreterGenerator::generate_native_entry()
其中进入native函数的call指令在这里生成:
http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/312b5f1dc31d/src/cpu/x86/vm/templateInterpreter_x86_64.cpp#l1080
返回也是返回到这里后面。

所谓“编译”版其实是如果一个native方法在解释模式被调用到了CompileThreshold次数之后,HotSpot VM会为该方法专门生成一个“native wrapper”,将其方法属性、参数迁移之类的信息都固化进去,相比解释器版开销会小一些。Native wrapper生成好之后会注册到方法的methodOop / Method里的from_compiled_entry那边

Native wrapper由这里生成:
http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/312b5f1dc31d/src/cpu/x86/vm/sharedRuntime_x86_64.cpp#l1723
SharedRuntime::generate_native_wrapper()
其中进入native函数的call指令由这里生成:
http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/312b5f1dc31d/src/cpu/x86/vm/sharedRuntime_x86_64.cpp#l2332
从native函数返回就返回到这里后面。
Global site tag (gtag.js) - Google Analytics