【问题标题】:JRI return code 10JRI 返回码 10
【发布时间】:2015-08-14 18:58:51
【问题描述】:

我是 R 新手,正在尝试从 java 调用一个简单的 rJava 测试程序。我已经完成了必要的路径设置以及何时 我正在尝试创建一个代码失败的 Rengine 实例。问题似乎出在 C [R.dll+0x26036] 上。但是,我对此并不陌生,无法弄清楚这个问题。欢迎任何帮助。

我的代码:

import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;
public class First_R {
public static void main (String args []) {

    System.out.println("Start");
    Rengine.DEBUG = 5;

    System.out.println("Starting Rengine..");
    System.out.println("R_HOME =" + System.getenv("R_HOME"));
    final Rengine re = new Rengine ();
    // Check if the session is working.
    if (!re.waitForR()) {
        return;
    }
    re.assign("x", new double[] {1.5, 2.5, 3.5});
    REXP result = re.eval("(sum(x))");
    System.out.println(result.asDouble());
    re.end();
}

}

输出:

开始 启动 Rengine.. R_HOME =D:\Program Files\R\R-3.2.0\bin\

Java 运行时环境检测到致命错误:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) 在 pc=0x000000006c726036, pid=4588, tid=1872

JRE 版本:Java(TM) SE 运行时环境 (8.0_45-b14) (build 1.8.0_45-b14) Java VM:Java HotSpot(TM) 64 位服务器 VM(25.45-b02 混合模式 windows-amd64 压缩 oops) 有问题的框架: C [R.dll+0x26036]

无法写入核心转储。默认情况下,在 Windows 的客户端版本上不启用小型转储

包含更多信息的错误报告文件保存为:

【问题讨论】:

  • 您是否设置了虚拟机选项?您需要设置 VM 选项,例如在 netbeans 中,我为 JRI -Djava.library.path='C:\Program Files\R\R-2.15.3\library\rJava\jri\x64' 插入了以下选项
  • 你的问题突然结束了:“带有更多信息的错误报告文件保存为:” ...?
  • @YehoshapatSchellekens,我在我的代码中添加了System.setProperty("JRI", "-Djava.library.path='D:/Misc/RLib/rJava/jri/x64'");。它仍然返回相同的错误。此外,由于我已将 rJava 安装到我的 exclipse 中,因此我已在我的首选项中设置了 dll 和 JRI 的路径。

标签: java r exception rjava jri


【解决方案1】:

在您的环境设置中,请将 R_HOME 更改为 D:\Program Files\R\R-3.2.0 而不是 R_HOME =D:\Program Files\R\R-3.2.0\bin\,请让我知道这样做是否可行 :),请注意您的代码对我有用(也使用 nicola 的建议)

package rundavid;

import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;



public class RunDavid {


public static void main (String args []) {



    System.out.println("R_HOME =" + System.getenv("R_HOME"));


    Rengine re = new Rengine (new String [] {"--vanilla"}, false, null);
    // Check if the session is working.
    if (!re.waitForR()) {
        return;
    }
    re.assign("x", new double[] {1.5, 2.5, 3.5});
    REXP result = re.eval("(sum(x))");
    System.out.println(result.asDouble());
    re.end();
}}

输出:

run:
R_HOME =C:\Program Files\R\R-2.15.3
7.5
BUILD SUCCESSFUL (total time: 0 seconds)

还需要设置D:\Program Files\R\R-3.2.0\bin\x64;D:\Misc\RLib\rJava\jri\x64 这需要在 vm 选项中设置,而不是作为环境变量。 这就是它在Netbeans 中的完成方式(我正在使用):

  1. 右键单击项目,然后单击属性
  2. 然后选择run
  3. 插入 VM 选项,如下所示:

【讨论】:

  • 它仍然对我不起作用。我的设置有问题吗?我在这里发布完整的输出:
  • 能否请您发布所有环境变量?
  • 你设置好JAVA_HOME和PATH了吗?
  • JAVA_HOME : C:\Program Files\Java\jdk1.8.0_45 JRE_HOME : C:\Program Files\Java\jre1.8.0_45 路径 : %SystemRoot%\system32;%SystemRoot%;%SystemRoot %\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin;D:\650444\Work\Tools\Octave\Octave3.6.4 _gcc4.6.2\bin;C:\Program Files\Java\jdk1.8.0_45\bin;C:\Program Files\Java\jre1.8.0_45\bin\server;D:\Program Files\R\R-3.2。 0\bin\x64;D:\Misc\RLib\rJava\jri\x64
  • 看看我的新答案
【解决方案2】:

您必须正确初始化您的Rengine。试试这个:

Rengine re = new Rengine (new String [] {"--vanilla"}, false, null);

当您创建引擎时,一切都应该正常工作。没有参数的构造函数“通过挂钩到调用此构造函数的现有初始化 R 实例来创建新引擎”(来自doc)。这会导致错误,因为没有现有的Rengine 正在运行(我猜)。

【讨论】:

  • 我之前在尝试调试错误时尝试过此操作。使用这行代码不会抛出我在问题中打印的堆栈跟踪错误,但程序执行以返回码 2 终止。在 eclipse 中使用调试模式我可以看到它在这个 Rengine 实例创建行中失败。
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 2023-03-25
  • 2014-05-26
  • 1970-01-01
相关资源
最近更新 更多