如何将 return Java class 的对象转换为 R(使用 rjava 包)

How to return Java Object of class into R (with rjava package)

有人在使用 R 并在那里使用 java 代码吗?我的意思是使用 "RJAVA" 包从 R 调用 Java 代码。

我创建了自己的程序包,其中包含 java 代码的 jar 文件。 (比如https://cran.r-project.org/web/packages/helloJavaWorld/vignettes/helloJavaWorld.pdf

然后我有 .r 文件,我想调用 java 方法。 问题是当我想要 return "Java Object of class" 时。 "I" 作为整数或 "S" 作为字符串都没有问题。我需要 R 中 Java class 的对象才能继续使用它。有可能的?我发现我可以 return Java 具有 return 值 "L" 的对象(例如 "Ljava/lang/Object"),但它不起作用。

这是我调用 java 代码的 R 代码:

FCA <- function(){

    a <- .jnew("fcamp/test/MainTest")  
    b <- .jcall(a, "S", "testFunction")
    c <- .jcall(a, "Lfcamp/input/Context;", "testFunction2")

    return(c) 
}

这是我的错误:

Error in .jcall(a, "Lfcamp/input/Context;", "testFunction2") : 
method testFunction2 with signature ()Lfcamp/input/Context; not found

错在哪里?有可能 return Java class 的对象到 R 并在那里继续使用它吗?

这是一个例子(我希望完整):

我有一个 java class :

package hello;

    public class Hello extends Object {

        public String sayHello2(String name) {
            String result = new String("Hello " + name);
            return result;
        }

        public Hello sayHello3(String name) {
            String result = new String("Hello " + name);
            return new Hello();
        }

    } 

sayHello3 returns 一个 Hello 对象。

创建 jar :

   java -cp .   hello/Hello.java
    jar cvf Hello.jar hello/Hello.class

在我的 R 会话中:没有 java 参考的调用

library(rJava)
.jinit()
.jaddClassPath(dir( "path to jar", full.names=TRUE ))
.jclassPath()  # you should see your jar
hjw <- .jnew("Hello")     # create instance of hell/Hello class

outRef <- .jcall(hjw, "S", "sayHello2", "toto", evalString = FALSE)
.jstrVal(outRef)

[1] "Hello World"

以及对返回 java 引用的函数的调用:

outRef2 <- .jcall(hjw, "Lhello/Hello;", "sayHello3", "Universe", evalString = T)
.jstrVal(outRef2)
outRef3 <- .jcall(outRef2, "S", "sayHello2", "New Universe", evalString = FALSE)
.jstrVal(outRef3)

返回:

"hello.Hello@74a14482"
"Hello New Universe"