使用rJava在R中编写Java包装器

4
我将使用rJava包在R中创建一个Java实现的封装器。目前,我只想为提到的Java实现中GeneralizedSuffixTree类的两个方法(put和search)创建一个封装器。 GeneralizedSuffixTree类的search()方法签名是:
public Collection<Integer> search(String word){
        return search(word, -1);
    }

相应地,我创建了以下的包装方法:

   callsearch <- function(key){
     hook2 <- .jnew("GeneralizedSuffixTree") # instance of class
     out <- .jcall(hook2,"Ljava/lang/Object","search",as.character(key), evalArray= FALSE, evalString = FALSE)
     return(out)
}

所以,每当我用callsearch("abcdea")从RStudio调用搜索方法时,我都会得到以下错误。
Error in .jcall(hook2, "Ljava/lang/Object", "search", as.character(key),  : 
  method search with signature (Ljava/lang/String;)Ljava/lang/Object not found

我觉得我在R中对整数集合进行了一些错误的转换。请问我哪里做错了?
完整的正在开发的包装器包位于link

如果您在Java代码中将返回类型从“Collection<Integer>”更改为“Object”,它是否有效? - rsutormin
是的,那样可以运行。在我的Java代码中,我将Collections<Integer>更改为数组返回类型,它完美地工作了。但我更关心集合。 - Haroon Lone
1个回答

3
问题出在JNI类型上。由于搜索方法返回一个集合,而对于集合,JNI指定为Ljava/util/Collection; 因此正确的包装方法是:
callsearch <- function(key){
     hook2 <- .jnew("GeneralizedSuffixTree") # instance of class
     out <- .jcall(hook2,"Ljava/util/Collection;","search",as.character(key), evalArray= FALSE, evalString = FALSE)
     return(out)
}

附加信息: 对于任何Java类,JNI类型可以在命令提示符下找到。

 javap -s <java-classname>

集合框架示例:javap -s java.util.Collections


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接