在 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"
而不是(末尾没有分号)。
关于警告:您可以忽略它们,只是代码模型无法完全理解这些方法的定义。
我想使用 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"
而不是(末尾没有分号)。
关于警告:您可以忽略它们,只是代码模型无法完全理解这些方法的定义。