ART 虚拟机中跳转函数为什么要用汇编做一次中转?为什么不直接跳转到 C/C++ 函数呢?

软件工程师、主攻高级编程语言虚拟机的设计与实现

17 👍 / 4 💬

题主问的是哪种“用来中转的汇编”?

======================

是这些compiler trampoline么?

android.googlesource.com

如果是的话,这些是用来做调用约定适配(calling convention adaptation)用的。

ART编译生成的代码所用的调用约定与其要调用的目标的调用约定不一定完全匹配。上面那个trampoline_compiler.cc里的代码非常直观的说明了不同约定之间到底适配了什么,例如要通过JNI调用native函数的话就得把JNIEnv*加载到第一个参数的位置上。

======================

还是说是ART的native-bridge的trampoline?这个目前的主要场景是用于支持x86上模拟ARM。

可以现参考这篇文章:

用于Android ART虚拟机JNI调用的NativeBridge介绍

这篇文章说NativeBridge的版本号必须是1,而现在最新的代码里其实已经有NativeBridge v2了(

android.googlesource.com

======================

最后放个通用传送门:

什么是桩代码(Stub)? - RednaxelaFX 的回答