我有以下 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"
>
享受 R
和 JNI
的乐趣:)
有趣的事实
您知道 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/