在 Android 中读取共享首选项期间 Qt 上的 JNI 出现 NoSuchMethodError

NoSuchMethodError with JNI on Qt during reading Shared Preferences in Android

我想使用 Android 中的共享首选项来永久保存用户 ID,即使用户卸载应用程序也是如此。为此,我使用 JNI/Qt5.12,但在读取 ID 时出现错误。

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

堆栈跟踪:

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.run(QtNative.java:365)
W/System.err(10285): at org.qtproject.qt5.android.QtThread.run(QtThread.java:61)
W/System.err(10285): at java.lang.Thread.run(Thread.java:818)

语义问题我也不明白: 警告:此处需要实例化函数QAndroidJniObject::callMethod,但没有可用的定义

有人知道这里出了什么问题吗?谢谢...

这个失败的原因是一个相当小的事情:"(Ljava/lang/String;I)I;" 中的一个额外的分号 - 它应该是 "(Ljava/lang/String;I)I" 而不是(末尾没有分号)。

关于警告:您可以忽略它们,只是代码模型无法完全理解这些方法的定义。