java - 从 R 调用 Java 类时的问题

标签 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,我仍然遇到相同的错误。

如何解决这个问题?

最佳答案

与你的类(class)一起(最好有一个包)

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
}

关于java - 从 R 调用 Java 类时的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56501807/

相关文章:

java - 来自 Class.forName 的 ClassNotFoundException ("com.mysql.jdbc.Driver");

hadoop - 如何确保 RegexSerDe 可用于我的 Hadoop 节点?

java - 将 java 系统属性传递给 ant 测试

java - 如何使内联标签(需要 com.sun)更跨平台?是否有非 Oracle/更多跨平台的 javadoc 解析器?

r - 这里 + ggplot2 特别是 ggsave

r - 在 R 中最大化二次目标函数服从线性等式和不等式约束

尽管提交帖子,Java mysql-connector ClassNotFoundException

java - 消除 lambda 中函数接口(interface)的歧义

java - 是否有可能在 Java 8 中创建一个无限增长的惰性集合,由递归定义?

r - 使用 ggplot2 获得反射(reflect)各个方面的百分比尺度