• java 调用 r, Can't find dependent libraries


    rJava是一个R语言和Java语言的通信接口,通过底层JNI实现调用,允许在R中直接调用Java的对象和方法。
    步骤:
    1.本地系统:
      Win7 64bit 企业版, jdk1.8.0_45,R3.2.2。
     
    2.在R中安装rJava:
     下载好R-3.2.2-win.exe,直接打开。输入:  
      > install.packages("rJava") 
      #加载rJava 
      > library(rJava) 
      > .jinit() 
      #R调用Java变量测试 
      > s <- .jnew("java/lang/String", "Hello World!") 
      > s
      [1] "Java-Object{Hello World!}"
     
    3.设置系统环境变量:
      R_HOME: C:Program FilesRR-3.2.2
      RJAVA_HOME:C:Program FilesRR-3.2.2library Java
      PATH:%R_HOME%in;%R_HOME%inx64;%RJAVA_HOME%jrix64;
     
    4.测试代码:
      
    import org.rosuda.JRI.Rengine;
    
    /**
     * Created by shida.min on 2015/10/27.
     */
    public class DemoRJava {
        static {
            System.loadLibrary("jri");
        }
        public static void main(String[] args) {
            DemoRJava demo = new DemoRJava();
            demo.callRJava(args);
        }
    // -Djava.library.path="C:Program FilesRR-3.2.2library
    Javajrix64"
        public void callRJava(String[] args) {
            System.out.println(System.getProperty("java.library.path"));
            Rengine re = new Rengine(args, false, null);
            if (!re.waitForR()) {
                System.out.println("Cannot load R");
                return;
            }
    
            //打印变量
            String version = re.eval("R.version.string").asString();
            System.out.println(version);
    
            //循环打印数组
            double[] arr = re.eval("rnorm(10)").asDoubleArray();
            for (double a : arr) {
                System.out.print(a + ",");
            }
            re.end();
        }
    
    }
    

    在工程中导入JRI.jar, JRIEngine.jar, REngine.jar三个包。

    使用 IntelliJ idea 作为 java IDE, 设置VM options:

    -Djava.library.path="C:Program FilesRR-3.2.2library
    Javajrix64"

    首次运行后报错:

    java.lang.UnsatisfiedLinkError: C:Program FilesRR-3.2.2library
    Javajrix64jri.dll: Can't find dependent libraries
    Disconnected from the target VM, address: '127.0.0.1:49750', transport: 'socket'
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1937)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1855)
        at java.lang.Runtime.loadLibrary0(Runtime.java:870)
        at java.lang.System.loadLibrary(System.java:1122)
        at com.xy.DemoRJava.<clinit>(DemoRJava.java:10)
    Exception in thread "main" 

    试了许多办法,都没用,后来在http://stackoverflow.com/questions/19100875/java-r-interface-jri-setup 上找到方法。

    把R目录下的所有*.dll文件都拷贝到jdk的bin目录下,并在程序中加上

    static {
        System.loadLibrary("jri");      
       }

    测试通过,mark。

  • 相关阅读:
    mysql 定时器
    mysql 存储过程记录
    mysql 常用sql
    mysql 取最后一条数据 分组
    Java8 Stream使用flatMap合并List 交 并 合 差集
    微服务技术栈
    spring boot 拦截 以及Filter和interceptor 、Aspect区别
    在springMVC的controller中获取request,response对象的一个方法
    spring boot 用@CONFIGURATIONPROPERTIES 和 @Configuration两种方法读取配置文件
    SSRS 2016 Forms Authentication
  • 原文地址:https://www.cnblogs.com/starRebel/p/4917297.html
Copyright © 2020-2023  润新知