如何使用rJAVA调用“主要”方法?

问题描述

我在.jar中具有这样的JAVA函数。

我想在R中调用此函数,但无法使用“ main”方法。有谁知道如何使用rJAVA调用此“主要”方法来产生结果?

我已经读过一个地方,我需要在JAVA代码中创建一个单独的静态方法来访问它,对吗?

public class CountJTrees
{
    public static void main(String[] args)
    {
        try
        {
            Network<String,Object> g = Graphs.read();

            try
            {
                JTree<String> jjt = new JTree<String>(g);
                System.out.println(jjt.enumerate());
            }
            catch(GraphNotDecomposableException e)
            {
                System.out.println(0);
            }

        }
        catch (Exception e)
        {
            System.err.println("Caught CountJTrees.main()");
            e.printStackTrace();
        }
    }
}

解决方法

假设您的结构如下:

.
|-- Manifest.txt
`-- src
    `-- somepackage
        `-- StringTest.java

文件StringTest.java包含:

package somepackage;

public class StringTest {
  public String changeString(String str) {
    return "I have changed the string: " + str;
  }

  public static void main(String [] arg) {
    System.out.println(new StringTest().changeString("Hello"));
  }
}

您可以轻松构建JAR文件。带有Manifest.txt文件

Manifest-Version: 1.0
Main-Class: somepackage.StringTest

以下方式:

> jar cfm test.jar Manifest.txt -C target somepackage/StringTest.class

# execute JAR - just to test it works as expected
> java -jar test.jar
I have changed the string: Hello

一旦JAR正常工作,就可以在R中运行它

> export CLASSPATH=./test.jar
> R

R version 3.6.1 (2019-07-05) -- "Action of the Toes"
Copyright (C) 2019 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin15.6.0 (64-bit)

...
...
...

> library(rJava)
> .jinit()
> obj <- .jnew("somepackage.StringTest")
> s <- .jcall(obj,returnSig="V",method="main",c("Hello","Hello") )
I have changed the string: Hello
>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...