他们使用像Mono的PInvoke这样的东西吗?或者更像是在运行时启动之前注册的内部调用? java有一个基本库来处理像mscorlib.dll这样的本机调用吗?如果我想在C代码中调用JVM,它库是否会查找.so / .dll文件?如果我静态链接所有JRE本机库,它会对Java标准库产生影响吗?
答案 0 :(得分:6)
他们使用JNI,就像公开记录一样,为特定平台调用本机共享库。
就从C代码调用JVM而言,JVM使用共享库(DLL,SO等)。快速搜索JDK 6源代码不会显示核心本机支持的任何System.loadLibrary()(如Object,String等中的本机方法)。这告诉我,这些方法的本机代码(似乎是在DLL中根据JRE / bin目录的内容判断)由java.exe(以及Windows中的javaw.exe)显式链接。
当我上次查看这些内容时,从C代码调用JVM的要求是JNI中记录良好的部分 - 我强烈建议您参考该doco继续进行。我们甚至为IBM AS / 400 Java 1.1 JVM成功编写了本机C包装器/加载器。
答案 1 :(得分:1)
他们使用Java Native Interface(JNI)。
我从来没有从C调用JVM,所以我不知道。
答案 2 :(得分:0)
这里有一个关于如何从C程序中启动JVM的示例:
答案 3 :(得分:0)
“Java Native Access (JNA) 为Java程序提供了对本机共享库(Windows上的DLL)的轻松访问,而无需编写除Java代码之外的任何内容”(来自其主页的引用)。
到目前为止,个人从未尝试过。