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

时间:2019-03-04 07:37:46

标签: android c++ qt java-native-interface

我想使用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);

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的实例化,但没有定义

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

1 个答案:

答案 0 :(得分:1)

失败的原因是一个很小的事情:"(Ljava/lang/String;I)I;"中要加一个分号-应该改为"(Ljava/lang/String;I)I"(末尾没有分号)。

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