Вызов java-метода из c ++ в qt

Я пытаюсь вызвать метод, определенный в активности android в c ++ qt, используя QAndroidJniObject. Вот мой вызов в классе c ++

QAndroidJniObject data = QAndroidJniObject::callStaticObjectMethod("com/android/app/appActivity", "appData", "(I)Ljava/lang/String;"); QString dataValue = data.toString(); qDebug() <<"Data is " << dataValue; 

Этот appData определен в классе appActiviy android и возвращает String, это определенный метод, который я хочу вызвать и получить возвращаемое строковое значение

 static String appData(){ Log.d("App Data is ", "Working"); return data; } 

Но я получаю null – dataValue, и это тоже не вызывает ошибок.

Возможно, вам придется вручную проверять исключения, чтобы получить ошибки Java.

Из документации Qt :

Обработка исключения Java

При вызове функций Java, которые могут генерировать исключение, важно, чтобы вы проверяли, обрабатывали и очищали исключение, прежде чем продолжить.

Примечание. Неиспользоваться вызовом JNI при ожидании исключений.

 void functionException() { QAndroidJniObject myString = QAndroidJniObject::fromString("Hello"); jchar c = myString.callMethod<jchar>("charAt", "(I)C", 1000); QAndroidJniEnvironment env; if (env->ExceptionCheck()) { // Handle exception here. env->ExceptionClear(); } } 

Вы действительно хотите позвонить в com/android/app/appActivity а не в com/android/app/Activity ?

Вот несколько мыслей:

  1. Используете ли вы Log.d () для печати строки перед возвратом, убедившись, что она не является нулевой?

  2. Не уверен, что это имеет значение, но вы указываете целое число как аргумент, но метод Java не имеет этого в своей сигнатуре. Затем вы должны указать это целое число как параметр в callStaticObjectMethod ().

  3. Как уже упоминалось Alex P, исключения должны быть обработаны, или они дадут вам головную боль, поскольку они могут случаться довольно часто, и сбой всего приложения.

  4. Я не могу найти какой-либо класс в com / android / app / appActivity в документации для Android. Вы имели в виду com / android / app / Activity? Если это так, я не могу найти здесь метод appData.

Спасибо, ребята, за ваш ответ, наконец, я понял это. Это было просто, тогда я пытался

 QAndroidJniObject data = QAndroidJniObject::callStaticObjectMethod("com/android/app/appActivity", "appData", "(I)Ljava/lang/String;"); 

В этом коде я не знал, что это (I)Ljava/lang/String; Означает тип параметра, который принимает ваш Java-метод, но в моем случае его не было. Поэтому правильный ответ

 QAndroidJniObject data = QAndroidJniObject::callStaticObjectMethod<jstring>("com/android/app/appActivity", "appData")` 

Обозначает возвращаемый тип моего определенного java-метода. Я думаю, это была глупая ошибка с моего конца … спасибо снова

Intereting Posts