Вызов простого статического метода Java через JNI не работает, хотя С++ компилирует и запускает его

Учитывая этот класс Java со статическим методом:

public class TestClass{
    public string str;
    public TestClass() {
        str = "Test From Java";
    }
    public static String staticMethod() {
        return "Test From Java";
    }
}

Я написал эти строки кода в файле С++:

QAndroidJniObject str =  QAndroidJniObject::callStaticObjectMethod(
                                   "org/.../TestClass"
                                   ,"staticMethod"
                                   ,"(V)Ljava/lang/String;");

Кажется, все работает, но я не знаю, как я могу использовать объект str. Я попытался преобразовать его в объект QString с помощью метода str.tostring(), но он всегда возвращает пустую строку. Почему это не работает, как ожидалось? Я также проверил ()Ljava/lang/String; на сигнатуру метода, но безуспешно!
Заранее спасибо.


person a.toraby    schedule 24.02.2015    source источник


Ответы (1)


Вы должны указать возвращаемый тип JNI в <...> при вызове метода:

QAndroidJniObject str =  QAndroidJniObject::callStaticObjectMethod<jstring>(
                               "org/.../TestClass"
                               ,"staticMethod");

QString string = str.toString();

Здесь нет необходимости определять подпись, поскольку у вашей функции нет аргумента.

person Nejat    schedule 24.02.2015
comment
Спасибо, Неджат. Это сработало успешно. Но как насчет статического метода, который возвращает строку и имеет некоторые входные параметры? Я пытался использовать callStaticObjectMethod, но соответствующей функции нет: QAndroidJniObject::callStaticObjectMethod<jstring>("org/.../TestClass" ,"staticMethod" ,"(Ljava/lang/String;)Ljava/lang/String;" ,val.object<jstring>()); - person a.toraby; 24.02.2015
comment
val является QAndroidJniObject: QAndroidJniObject::fromString("This is test"); - person a.toraby; 24.02.2015
comment
В вашем подходе нет ничего плохого, я ничего не могу придумать. Может быть, лучше задать эту проблему в новом вопросе и описать ее подробнее. - person Nejat; 24.02.2015