【问题标题】:How does Java standard libraries comunicate with native code?Java 标准库如何与本机代码通信?
【发布时间】:2010-07-15 01:04:18
【问题描述】:
他们是否使用 Mono 的 PInvoke 之类的东西?还是更像是在运行时启动之前注册的内部调用? java 是否有用于处理诸如 mscorlib.dll 之类的本机调用的基础库?如果我想在 C 代码中调用 JVM,它的库会查找 .so/.dll 文件吗?如果我静态链接所有 JRE 本机库,它会对 Java 标准库产生影响吗?
【问题讨论】:
标签:
java
jvm
java-native-interface
jvm-hotspot
【解决方案1】:
他们完全按照公开记录的方式使用 JNI 来调用特定平台的本地共享库。
就从 C 代码调用 JVM 而言,JVM 使用共享库(DLL、SO 等)。快速搜索 JDK 6 源代码并没有发现任何 System.loadLibrary() 对核心本机支持(如 Object、String 等中的本机方法)。这表明这些方法的本机代码,从 JRE/bin 目录的内容来看,似乎在 DLL 中,由 java.exe(和 Windows 中的 javaw.exe)显式链接。
当我上次查看这些内容时,从 C 代码调用 JVM 的要求是 JNI 的一个有据可查的部分——我强烈建议您参考该文档以进一步进行。我们甚至成功地为 IBM AS/400 Java 1.1 JVM 编写了本机 C 包装器/加载器。
【解决方案2】:
他们使用 Java 本地接口 (JNI)。
我从来没有从 C 调用过 JVM,所以我不知道。