我有以下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
,我仍然遇到相同的错误。
我该如何解决这个问题?
答案 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"
>
玩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
}