2015-10-06 73 views
4

使用rJava我用rJava包來創建一個包裝爲R.目前java implementation,我想創建一個只有兩個方法GeneralizedSuffixTree類存在於提到java實現一個包裝(放和搜索) 。Java包裝中的R

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) 
} 

所以,每當我打電話從rstudio搜索方法與callsearch("abcdea"),我曾經得到以下錯誤

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

+0

它的工作原理如果您將'Collection '的返回類型更改爲java代碼中的'Object'? – rsutormin

+0

是的,它可以工作。在我的java代碼中,我將集合更改爲數組返回類型,它工作完美。但我更關心收藏。 –

回答

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