从R调用Java类时出现问题

时间:2019-06-07 22:18:56

标签: java r classnotfoundexception rjava

我有以下Java类:

public class Processor {
    public String showMsg(String msg) {
        return "The message is : " + msg;
    }

    public static void main(String [] arg) {
        Processor pro = new Processor();
        System.out.println(pro.showMsg(arg[0]));
    }
}

我想从以下R脚本中调用此类,这是我第一次使用rJava库:

testJav <- function(){
  library(rJava)
  .jinit()
  obj <- .jnew("/home/adam/eclipse-workspace/TestMeProject/bin/Processor.class")
  xx <- .jcall(obj,"Say hi to her") #I'm not sure if this is the right way to pass the message as a String argument!
  xx
}

运行脚本时,出现以下错误:

Error in .jnew("/home/adam/eclipse-workspace/TestMeProject/bin/Processor.class") : 
  java.lang.ClassNotFoundException: /home/adam/eclipse-workspace/TestMeProject/bin/Processor/class 

我认为问题出在Processor.class上,但是即使我删除了.class,我仍然遇到相同的错误。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

您正在尝试将文件路径传递到.jnew,但是.jnew并没有文件路径。如docs中所述,第一个参数应该是一个

  

采用JNI表示法的完全限定的类名称(例如“ java / lang / String”)。

基本上,如果将Java程序中的类导入为com.mystuff.MyClass,则无论{{1}在何处,应传递给.jnew的名称都将是"com/mystuff/MyClass"。 }文件。

您可能会注意到,这无法让您说出该类文件的位置。这是因为.class并不是您告诉rJava在哪里找到东西的地方。 .jpackage是R包将其Java文件添加到Java类路径的标准方法。如果要向类路径添加任意目录或.jar文件,则还有一个.jaddClassPath函数。

答案 1 :(得分:0)

与您的班级在一起(有一个包裹是一个好主意)

package mypackage;

public class Processor {
    public String showMsg(String msg) {
        return "The message is : " + msg;
    }

    public static void main(String [] arg) {
        Processor pro = new Processor();
        System.out.println(pro.showMsg(arg[0]));
    }
}

存储在文件src/mypackage/Processor

遵循

> mkdir target
> javac -d target src/mypackage/Processor.java
> export CLASSPATH=`pwd`/target
> R

然后在R内进行愚弄

testJav <- function(){
  library(rJava)
  .jinit()
  obj <- .jnew("mypackage/Processor")
  xx  <- .jcall(obj, returnSig="Ljava/lang/String;", method="showMsg", "Say hi to her")
}

一切准备就绪,这就是您将得到的

> export CLASSPATH=`pwd`/target
> R
...
...
...
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> library(rJava)
> .jinit()
> obj <- .jnew("mypackage/Processor")
> xx  <- .jcall(obj, returnSig="Ljava/lang/String;", method="showMsg", "Say hi to her")
> xx
[1] "The message is : Say hi to her"
>

RJNI:)

有趣的事实

您知道javap对获取方法签名很有帮助吗?

> javap -s mypackage/Processor
Compiled from "Processor.java"
public class mypackage.Processor {
  public mypackage.Processor();
    descriptor: ()V

  public java.lang.String showMsg(java.lang.String);
    descriptor: (Ljava/lang/String;)Ljava/lang/String;

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
}