lit*_*net 5 c++ java native managed
我基本上理解托管和本机代码的概念及其区别.但他们在技术上如何相互沟通呢?想象一下以下示例:
我得到了一些为特定平台编译的静态或动态c ++库.现在我编写一个Java程序.在这段代码中,我使用'native'关键字调用库函数.我用字节码构建一个jar文件,c ++库文件将保持独立.结果将不再是与平台无关的.
但java程序如何知道调用的本机方法是否存在?
整个programmcode在运行时是如何执行的?我知道字节码将用JIT解释或编译.
这一切如何适合沙盒范例?本机代码是否也在沙箱中执行?
它是否有效,因为(java和c ++)代码到底都是机器代码?
也许这是一个愚蠢的问题.但我一直在想......
编辑:我有3个很好的答案.真的无法决定哪个对我帮助最大.但我会将这个问题标记为已经回答,以便从我这边关闭这个话题.
在您调用该方法之前它并不知道。本机代码驻留在 .DLL 或 .so 中;java 运行时查找与您创建的本机方法相对应的特定入口点(如果您使用 JNI,则有一个工具可以解析方法并创建函数存根,这些存根将在编译时生成这些入口点)。如果所需的入口点不存在,则会抛出异常。
JIT 生成的代码并不是完全自给自足的;它必须不时调用外部本机代码(用于低级运行时例程或操作系统服务)。使用相同的机制来调用本机方法的代码。
不。您可以在那里完成在纯 C/C++ 程序中要做的所有事情。唯一可以阻止它造成任何损害的是您拥有的外部安全措施(登录权限限制、其他操作系统保护、安全软件等),但虚拟机不会保护您。
不,JNI 甚至在 JIT 出现之前就已经存在了。机制是相同的,如果字节码由解释器运行,并且您希望该解释器调用本机代码,您只需要其中的一些逻辑来确定给定方法是“外部”并且应该作为本机代码调用。此信息包含在已编译的 .class 文件中,当解释器或 JIT 加载它时,它会创建一个内存表示形式,以便轻松地直接调用方法查找。
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |