尝试显示此 Toast 时,我的函数做错了什么?
QNativeInterface::QAndroidApplication::runOnAndroidMainThread([=]() {
QJniEnvironment env;
jclass clazz = env.findClass("android/widget/Toast");
QJniObject displayText = QJniObject::fromString("Hello world");
jint timeout = 10;
QJniObject callableToast = QJniObject::callStaticMethod<jobject>(
clazz,
"makeText",
QNativeInterface::QAndroidApplication::context(),
displayText.object<jstring>(),
timeout
);
callableToast.callMethod<void>("show");
QNativeInterface::QAndroidApplication::context());
}).waitForFinished();
这一直失败:
java.lang.NoSuchMethodError: no static method "Landroid/widget/Toast;.makeText(Landroid/content/Context;Ljava/lang/String;I)Ljava/lang/Object;"
根据 Android Toast 文档,参数和返回类型对我来说似乎是正确的。我还尝试将返回类型更改为
jclass
,但失败并出现类似的错误。
FWIW,我也尝试过显式设置签名,但它失败并出现类似的错误:
QJniObject callableToast = QJniObject::callStaticMethod<jobject>(
clazz,
"makeText",
// "Landroid/content/Context;Ljava/lang/String;I)Landroid/widget/Toast;"
"(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast",
QNativeInterface::QAndroidApplication::context(),
displayText.object<jstring>(),
timeout
);
我也在日志中看到了这一点,但不知道它是否有价值:
W System : ClassLoader referenced unknown path:
这就是我解决的方法:
QJniObject toast = QJniObject::callStaticObjectMethod(
"android/widget/Toast",
"makeText",
"(Landroid/content/Context;Ljava/lang/CharSequence;I)"
"Landroid/widget/Toast;",
QNativeInterface::QAndroidApplication::context(),
displayText.object<jstring>(),
timeout
);
if (toast.isValid()) {
qDebug() << "Toast is valid";
toast.callMethod<void>("show");
} else {
qDebug() << "Toast JNI object not valid";
}