1

他们是否使用 Mono 的 PInvoke 之类的东西?还是更像是在运行时启动之前注册的内部调用?java 是否有用于处理诸如 mscorlib.dll 之类的本机调用的基础库?如果我想在 C 代码中调用 JVM,它的库会查找 .so/.dll 文件吗?如果我静态链接所有 JRE 本机库,它会对 Java 标准库产生影响吗?

4

4 回答 4

6

他们完全按照公开记录的方式使用 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 包装器/加载器。

于 2010-07-15T01:07:04.237 回答
1

他们使用 Java 本机接口 (JNI)。

我从来没有从 C 调用过 JVM,所以我不知道。

于 2010-07-15T01:07:56.997 回答
0

这里有一个关于如何从 C 程序内部启动 JVM 的示例:

http://www.inonit.com/cygwin/jni/invocationApi/c.html

于 2010-07-15T06:36:11.617 回答
0

Java Native Access (JNA)使 Java 程序可以轻松访问本地共享库(Windows 上的 DLL),而无需编写任何东西,只需要编写 Java 代码”(引自其主页)。

到目前为止,个人从未尝试过。

于 2010-07-15T07:09:51.100 回答