从Java里调用R – JRI的设置方法

JRI允许用户从Java里面调用R的功能,而Eclipse是目前最常用的Java开发环境。本文介绍在Eclipse里设置JRI的方法。

环境:
Windows 7 32bit
Eclipse 3.6
R 2.13.1
rJava 0.9-1

1.在R里安装rJava扩展包。JRI已经被包含在rJava里了。命令是: install.packages(“rJava”)。运行完成后rJava默认被安装在R的安装路径,如:C:\Program Files\R\R-2.13.1\library\rJava。

2.打开JRI的安装目录,如:C:\Program Files\R\R-2.13.1\library\rJava\jri,即可看到从Java里调用时需要使用的文件和目录。其中: examples中包含示例Java源文件,可以用来测试你的设置是否正确。jri.dll是需要使用的动态链接库,运行Java程序时会被用到。JRI.jar以及另两个jar文件是Java类库,编译Java源文件时需要用到。

3.我们现在在Eclipse里新建一个Java项目,然后把examples目录里的.java文件复制到这个项目里。

4.下面要设置运行环境。

4.1 首先使Java类能够编译。需要把上面提到的三个jar文件加到项目的类路径里。右键点击项目名,选择Properties,然后在左侧边栏中选择Java Build Path,然后在右侧tab里选择Libraries,然后选择Add External JARs…,在弹出的选择框里选择jri文件夹里的三个.jar文件,点确定。这时,这三个新文件应该会在界面上被列出来。点击OK退出项目属性界面后,Java类应该会被重新编译,所有文件应该能被编译通过了。

4.2 配置运行时的动态链接库。主要是两步:首先,包含jri.dll的文件夹必须在java.library.path里;其次,R.dll必须在运行路径下。在Eclipse项目里,右键点击rtest.java,在弹出菜单里选择”Run As…”,然后选择”Run Configurations …”,这时会出现对话框。在右边列出的tab中,选择Arguments这个tab,在VM Arguments里加入一行:-Djava.library.path=”C:\Program Files\R\R-2.13.1\library\rJava\jri”。然后tab里选择Environment,按New添加新变量,变量名为PATH,值是C:\Program Files\R\R-2.13.1\bin\i386。

配置Arguments的界面:

配置Environment的界面:

5.完成上一步后,运行刚才新建的配置即可。运行时的界面如下:

您可能还会觉得这些文章有用:

  1. Linux中对不同版本的软件进行管理(update-alternatives)
  2. git-svn rebase的出错信息
  3. 克隆VMWare ESXi虚拟机 – 续

About Fan
从事软件行业多年,关心软件工程与技术、项目管理、数据统计与分析、BI、Java软件开发。

Comments

13 Responses to “从Java里调用R – JRI的设置方法”
  1. Wang says:

    为何我照您的步骤做,运行rtest后出现could not find main class:Files\R\R-2.14.0\library\rJava\jri? Program will exit.?能在帮我指导下吗?这个问题已经困扰我很久了。

  2. Wang says:

    还有这些提示:
    java.lang.NoClassDefFoundError: Files\R\R-2/14/0\library\rJava\jri
    Caused by: java.lang.ClassNotFoundException: Files\R\R-2.14.0\library\rJava\jri
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    Exception in thread “main”

  3. Fan says:

    看起来像是运行Java的方式有问题,“java.lang.NoClassDefFoundError: Files\R\R-2/14/0\library\rJava\jri” 表明找不到类,而类名是你这个文件路径。但类名明显不应该是文件路径。比如,我运行一个Java类应该是用类似这样的命令:java -classpath c:\mycode\ com.test.MyMainClass

  4. Wang says:

    我也觉的是类名出了问题。是不是在-Djava.library.path设置的地方,最后还需要补上类名呢?如rtest

    在右边列出的tab中,选择Arguments这个tab,在VM Arguments里加入一行:-Djava.library.path=”C:\Program Files\R\R-2.13.1\library\rJava\jri”。

  5. Fan says:

    你说的这个设置是配置JRI的链接库的,这个一定要有。其次Environment这个tab里要配PATH

  6. Wang says:

    有一个R_home变量是不是也需要设置呢?我看很多人说要设置那个东西,如果要的话在哪里设置呢?

  7. Wang says:

    我的rtest显示出来Creating Rengine (with arguments)了,我把java.library.path似乎解决了,但是和你的结果还是差一些。Native library可以右击项目,在property for src中设置。

  8. Wang says:

    我知道了,R_home还要在环境变量里面设置,然后重启才能生效。第一个例子做出来了,第二个例子走到Creating Rengine (with arguments)后,还是显示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: no jri in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1709)
    at java.lang.Runtime.loadLibrary0(Runtime.java:823)
    at java.lang.System.loadLibrary(System.java:1030)
    at org.rosuda.JRI.Rengine.(Rengine.java:19)
    at rtest2.main(rtest2.java:72)
    很崩溃!!!

  9. Fan says:

    步骤4.2设置了吗?这个错误是因为找不到JRI的DLL造成的。

  10. Kevin says:

    如果我不用eclipse编译,直接命令行编译,应该怎么设置那个environment呢?我试过在系统环境变量里添加那个R的路径,但还是不行~~你知道应该怎么办吗?谢谢!

  11. Fan says:

    用不用ECLIPSE都没关系,道理是一样的,一个是运行java命令时要有-Djava.library.path这个参数,另一个是R.dll必须在PATH这个环境变量上。你做到这两点就没问题了。

  12. 小凡 says:

    R大牛,

    请问,按照你这边提供的方案能够在Eclipse 通过 Java 调用 R。但是 R 启动的过程中出现中文乱码!!!

    望指教

    谢谢
    小凡

  13. Fan says:

    你的系统语言是什么?

Speak Your Mind

Tell us what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!