简体   繁体   English

在R中包装rjava jcall错误

[英]package rjava jcall error in R

I want to use R to input a parameter into Java, for example "1000". 我想使用R在Java中输入参数,例如“ 1000”。 Then method of StringToNum process and output its return to R,namely 1000. Seems it is the work of .jcall(), but I dont know how to do with its parameters.As I dont know Java, Could you please help me? 然后StringToNum方法处理并将其返回值输出到R,即1000。似乎它是.jcall()的工作,但是我不知道如何使用它的参数。由于我不了解Java,请您能帮我吗? Thank you very much! 非常感谢你!

Java code Java代码

package com.mingdong.rcalljava.test;

import java.io.PrintStream;

public class StringToNum
{
 private String inputString = null;

 public StringToNum(String inputString)
{
  this.inputString = inputString;
}

 public StringToNum()
{
}

 public int convertStringToInt() 
{
    if (this.inputString == null) {
    this.inputString = "100";
    }
    return Integer.valueOf(this.inputString).intValue();
}

 public static void main(String[] args)
  {
   StringToNum stringToNum = new StringToNum();
   int num = stringToNum.convertStringToInt();
   System.out.println("num:" + num);
  }
 }

R code R代码

library(rJava)
.jinit()
.jinit('D:/Eclipse/dailyjob/javaProject/TestRCallJava.jar')

## .jaddClassPath("D:\\Eclipse\\dailyjob\\javaProject\\TestRCallJava.jar")

inputString <- .jnew("java.lang.String","1000")
inputString %instanceof% "java.lang.String"

StringToNum <- .jnew("com.mingdong.rcalljava.test.StringToNum")
StringToNum %instanceof% "com.mingdong.rcalljava.test.StringToNum"

.jcall(StringToNum,returnSig= "V", "main",inputString )
Error in .jcall(StringToNum, returnSig = "V", "main") : 
method main with signature ()V not found

There are two issues. 有两个问题。 On the Java side in main you call the constructor new StringToNum() which does not exist. main的Java端,您将构造函数称为new StringToNum() ,该构造函数不存在。 The main method should rather look like: 主要方法应如下所示:

public static void main( String[] args ) {
  StringToNum stringToNum = new StringToNum( args[0] );
  int num = stringToNum.convertStringToInt();
  System.out.println("num:" + num);
}

Maybe this solves already your problem. 也许这已经解决了您的问题。 However, in general you call static methods in Java not on the object but on the class. 但是,通常在Java中,不是在对象上而是在类上调用静态方法。 If you'd call the main method from Java you'd have to call 如果要从Java调用main方法,则必须调用

StringToNum.main( "1000" );

instead of calling 而不是打电话

StringToNum obj = new StringToNum( "" );
obj.main( "1000" );

You should also avoid to call the low-level functions (indicated by starting with a . ) of the rJava package. 您还应该避免调用rJava包的低级函数(以.开头)。 So as indicated in rJava .jcall return type issue the proper call would be 因此,如rJava .jcall返回类型问题中所述,正确的调用将是

J("com.mingdong.rcalljava.test.StringToNum")$main( "1000" ) # untested

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM