You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt6 Android通过JNI调用Toast失败问题排查

问题分析与解决方案

你的代码存在多处错误,直接导致了java.lang.NoSuchMethodError,以下是具体问题和修正方案:

核心错误点

  1. QJni静态方法调用参数顺序错误
    QJniObject::callStaticMethod的正确参数顺序是:类对象 → 方法名 → 方法签名 → 实际参数。你直接跳过方法签名传递参数,JNI无法匹配到正确的makeText方法。

  2. Toast.makeText方法签名不匹配
    Android官方定义的Toast.makeText方法签名为(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;,你未指定正确签名,且错误将返回类型按Object处理(实际返回Toast实例)。

  3. 超时参数使用无效值
    Toast的超时参数必须使用系统常量:Toast.LENGTH_SHORT(值为0)或Toast.LENGTH_LONG(值为1),你传入的10是无效值,会导致方法调用异常。

  4. 冗余代码干扰
    代码末尾存在一行多余的QNativeInterface::QAndroidApplication::context());,会导致编译/运行错误,需删除。

修正后的代码

QNativeInterface::QAndroidApplication::runOnAndroidMainThread([=]() {
    QJniEnvironment env;
    jclass toastClazz = env.findClass("android/widget/Toast");
    if (!toastClazz) {
        return; // 处理类查找失败的情况
    }

    QJniObject displayText = QJniObject::fromString("Hello world");
    // 使用系统定义的Toast超时常量
    jint timeout = QJniObject::getStaticField<jint>("android/widget/Toast", "LENGTH_SHORT");

    // 按正确顺序调用静态方法:类、方法名、方法签名、实际参数
    QJniObject toastObj = QJniObject::callStaticMethod<jobject>(
        toastClazz,
        "makeText",
        "(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;",
        QNativeInterface::QAndroidApplication::context(),
        displayText.object<jstring>(),
        timeout
    );

    if (toastObj.isValid()) {
        toastObj.callMethod<void>("show");
    }

    env.deleteLocalRef(toastClazz); // 释放JNI局部引用,避免内存泄漏
}).waitForFinished();

额外说明

日志中的W System : ClassLoader referenced unknown path:是Android应用加载时的常规警告,与当前Toast调用错误无关,通常是native库路径配置问题,不影响Toast功能,可忽略或检查gradle配置中的native库路径。

内容的提问来源于stack exchange,提问作者mathe_matician

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:23:15