NoSuchMethodError с JNI на Qt во время чтения общих настроек в Android - PullRequest
0 голосов
/ 04 марта 2019

Я хочу использовать общие настройки в Android для постоянного сохранения идентификатора пользователя, даже если пользователь удаляет приложение.Для этого я использую JNI / Qt5.12, но во время чтения идентификатора я получаю ошибку.

https://developer.android.com/training/data-storage/shared-preferences.html

Чтение:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.integer.saved_high_score_default_key);
int highScore = sharedPref.getInt(getString(R.string.saved_high_score_key), defaultValue);

JNI:

jint mp = QAndroidJniObject::getStaticField<jint>("android/content/Context", "MODE_PRIVATE");
QAndroidJniObject name = QAndroidJniObject::fromString("test");
QAndroidJniObject activity = QtAndroid::androidActivity();
QAndroidJniObject sharedPref = activity.callObjectMethod("getPreferences", "(I)Landroid/content/SharedPreferences;", mp);
jint defId = 2;

// this line throws
jint id = sharedPref.callMethod<jint>("getInt","(Ljava/lang/String;I)I;", name.object<jstring>(), defId);

Stacktrace:

W/System.err(10285): java.lang.NoSuchMethodError: no non-static method "Landroid/app/SharedPreferencesImpl;.getInt(Ljava/lang/String;I)I;"
W/System.err(10285): at org.qtproject.qt5.android.QtNative.startQtApplication(Native Method)
W/System.err(10285): at org.qtproject.qt5.android.QtNative$6.run(QtNative.java:365)
W/System.err(10285): at org.qtproject.qt5.android.QtThread$1.run(QtThread.java:61)
W/System.err(10285): at java.lang.Thread.run(Thread.java:818)

Я также не понимаю смысловой проблемы: предупреждение: создание экземпляра функции QAndroidJniObject :: callMethod здесь требуется, но определение недоступно

Кто-то знает, что здесь происходит не так?Thxs ...

1 Ответ

0 голосов
/ 04 марта 2019

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

Относительно предупреждений: Вы можете игнорироватьдля них это просто модель кода, которая не в состоянии полностью понять определения этих методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...