gpt4 book ai didi

java - 混合代码( native 、托管): how does it (technically) interoperate?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:45 25 4
gpt4 key购买 nike

我基本理解托管代码和 native 代码的概念及其 difference .但是他们之间如何在技术上进行交流呢?想象一下以下示例:

我得到了一些为特定平台编译的静态或动态 C++ 库。现在我写了一个 Java Programm。在这段代码中,我使用“native”关键字调用库函数。我用字节码构建一个 jar 文件,c++ 库文件将保持独立。结果将不再与平台无关。

  1. 但是 java 程序如何知道调用的本地方法是否存在?

  2. 整个程序代码是如何在运行时执行的?我知道字节码将用 JIT 解释或编译。

  3. 这一切如何适应沙盒范式? native 代码是否也在沙箱内执行?

  4. 是否因为(java 和 c++)代码最终都是机器码才行得通?

也许这是个愚蠢的问题。但我一直想知道...

编辑:我得到了 3 个好的答案。真的无法决定哪个对我帮助最大。但我会将这个问题标记为已回答,以从我这边结束这个话题。

最佳答案

  1. 直到您调用该方法,它才会知道。 native 代码驻留在 .DLL 或 .so 中; Java 运行时查找与您创建的 native 方法相对应的特定入口点(如果您使用的是 JNI,则有一个工具可以解析这些方法并创建函数 stub ,这些 stub 将在编译时产生这些入口点)。如果所需的入口点不存在,则会抛出异常。

  2. JIT 生成的代码并非完全自给自足;它必须不时调用外部 native 代码(用于低级运行时例程或操作系统服务)。相同的机制用于为您的 native 方法调用代码。

  3. 没有。你可以在那里做你在纯 C/C++ 程序中所做的一切。唯一能阻止它造成任何损害的是您拥有的外部安全措施(登录权限限制、其他操作系统保护、安全软件等),但 VM 不会保护您。

  4. 不,JNI 甚至在 JIT 出现之前就已经存在了。机制是相同的,如果字节码由解释器运行,并且您希望该解释器调用 native 代码,您只需要其中的一些逻辑来确定给定的方法是“外部的”并且应该作为 native 代码调用.此信息包含在已编译的 .class 文件中,当解释器或 JIT 加载它时,它会创建一个内存表示,便于在方法查找时直接调用。

关于java - 混合代码( native 、托管): how does it (technically) interoperate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33943822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com