Java-оболочка с использованием rJava в R

Я использую пакет rJava для создания оболочки для реализация Java в R. В настоящее время я хочу создать оболочку только для двух методов (put и search) класса GeneralizedSuffixTree, присутствующих в упомянутом Java-реализация.

Подпись метода search() класса GeneralizedSuffixTree:

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

Я думаю, что делаю неправильное приведение для коллекции Integer в R. Могу ли я узнать, где я делаю неправильно?

Полный пакет оболочки, находящийся в стадии разработки, доступен по ссылке.


person Haroon Rashid    schedule 06.10.2015    source источник
comment
Будет ли это работать, если вы измените тип возвращаемого значения с Collection<Integer> на Object в своем коде Java?   -  person rsutormin    schedule 06.10.2015
comment
Да, тогда работает. В моем java-коде я изменил Collections‹Integer› на тип возвращаемого массива, он работал отлично. Но меня больше волнуют коллекции.   -  person Haroon Rashid    schedule 07.10.2015


Ответы (1)


Проблема с типом 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

person Haroon Rashid    schedule 07.10.2015