Java. JNI. jvm.dll

6
我有一个Visual Studio C++项目,需要调用一些java功能。我打算使用JNI。我已经指定了额外的包含目录:
C:\Program Files (x86)\Java\jdk1.7.0_10\include C:\Program Files (x86)\Java\jdk1.7.0_10\include\win32
还有额外的库目录
C:\Program Files (x86)\Java\jdk1.7.0_10\lib
我已经成功编译所需的代码。但是由于下一个错误,我仍然无法运行它:
The program can't start because jvm.dll is missing...
我假设最简单的方法就是将dll文件复制到项目目录中。但我不知道应该复制哪个。例如,我找到了几个不同的dll文件:
C:\Program Files (x86)\Java\jdk1.7.0_10\jre\bin\client\jvm.dll
C:\Program Files (x86)\Java\jdk1.7.0_10\jre\bin\server\jvm.dll
C:\Program Files (x86)\Java\jre7\bin\client\jvm.dll
那我应该复制哪一个呢?
1个回答

4
您正在错误的方向上解决问题。您不需要复制“jvm.dll”,而是需要设置正确的“JAVA_HOME”环境变量,指向“C:\Program Files (x86)\Java\jdk1.7.0_10\”或“C:\Program Files (x86)\Java\jre7\”。然后通过“java”参数“-client”或“-server”(没有参数时默认)选择DLL的版本。
更新:现在重新阅读问题,我发现情况是运行本地程序并从中调用JVM,而不是(更常见的)从JVM调用本地库。在这种情况下,本地程序确实需要访问“jvm.dll”。当从JVM调用本地库时,“jvm.dll”已经被JVM预加载,本地库不需要关心它。

仅仅设置JAVA_HOME是不够的。此外,必须定义指向jvm.dll路径(或者只需复制DLL)。客户端版本和服务器版本有何区别?我在系统中只有这两个DLL还是还有其他的? - Andrew
客户端和服务器几乎是相同的,只是在用作命名时会调整以获得更好的性能。但当您使用另一个选项时,并不会发生太糟糕的事情。 - Pavel Zdenek
我不明白解决方案是什么。我们如何让C++程序看到jvm.dll以避免原始问题中的错误? - Amber
@Amber,关于从C#执行Java的问题,SO上已经有比我更详细的答案了-第一个链接:https://dev59.com/E3PYa4cB1Zd3GeqPmr1r - Pavel Zdenek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接