java.lang.UnsatisfiedLinkError:Java无法找到我的dll?

时间:2011-09-27 21:19:07

标签: java r

我正在开发一个使用JRI / rJava从Java调用R函数的程序。我在另一台机器上用NetBeans编写程序,它运行正常(即能够运行代码)。从那以后,我搬到了另一台机器上,遇到了问题。

我看到的确切错误信息是:

Cannot find JRI native library!
Please make sure that the JRI native library is in a directory listed in java.library.path.
java.lang.UnsatisfiedLinkError: E:\R\R-2.13.1\library\rJava\jri\jri.dll: The specified path is invalid
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1807)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1732)
    at java.lang.Runtime.loadLibrary0(Runtime.java:823)
    at java.lang.System.loadLibrary(System.java:1028)
    at org.rosuda.JRI.Rengine.<clinit>(Rengine.java:19)
    at com.rjava.test.rtest.main(rtest.java:64)
Java Result: 1

我已经阅读了JRI / rJava的常见问题解答,并且已经在互联网上搜索修复程序,但没有取得任何进展。以下是我到目前为止所做的事情:

  • 创建了一个名为R_HOME的环境变量:“E:\ R \ R-2.13.1”
  • 将“%R_HOME%\ bin \ x64”添加到PATH环境变量
  • 将“%R_HOME%\ library \ rJava \ JRI”添加到PATH环境变量中(这是jri.dll所在的位置)
  • 在NetBeans中将所需的jar文件设置为编译时库(JRI.jar,JRIEngine.jar,REngine.jar)
  • 在NetBeans中设置以下VM选项:: -Djava.library.path = E:\ R \ R-2.13.1 \ library \ rJava \ jri(这是jri.dll所在的位置)

我已重新启动计算机以确保更改仍然存在。

为了确保我正确配置了东西,我在命令行中运行了以下命令:

java -cp E:\R\R-2.13.1\library\rJava\jri\JRI.jar;E:\R\R-2.13.1\library\rJava\jri\examples rtest

示例java文件运行正常。我开始认为我的新机器只是讨厌我。

3 个答案:

答案 0 :(得分:2)

该消息表明路径E:\ R \ R-2.13.1 \ library \ rJava \ jri \ jri.dll无效。你确定这条路存在吗?另外,E映射的驱动器是否映射到其中包含空格的路径?我不确定空间是否是问题,但它消除了一个问题。我会尝试将dll放在C:\或某个非常简单的地方,看看它是否可以在那里找到它作为一个简单的测试。

同时验证-Djava.library.path是否按照您的想法传递(您可以使用visualvm或jconsole检查)。

答案 1 :(得分:1)

你可以试试这个:

-Djava.library.path=E:\R\R-2.13.1\library\rJava\jri -cp E:\R\R-2.13.1\library
\rJava\jri;E:\R\R-2.13.1\library\rJava\jri\JRI.jar;E:\R\R-2.13.1
\library\rJava\jri\examples

我说这个的原因是,也许.dll也需要在类路径和库路径中才能让类加载器加载它?它可能不是真的,但值得一试。 “rJava”也正确吗?除此之外,我认为你做得对。

答案 2 :(得分:0)

要找到随rJava一起安装的JRI,请在R。

中使用system.file("jri",package="rJava")

设置路径的路径(windows中的环境变量), 重启你的netbeans。并尝试再次运行您的程序