Qt6 Android如何通过JNI调用Toast?

问题描述 投票:0回答:1

尝试显示此 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:
android qt java-native-interface qt6
1个回答
0
投票

这就是我解决的方法:

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";
                    }
© www.soinside.com 2019 - 2024. All rights reserved.