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

Qt CMake开发Android应用集成AdMob遇Java方法找不到问题求助

解决Qt+CMake集成AdMob时的NoSuchMethodError问题

1. 确认Java代码的继承与打包配置

  • 自定义Activity必须继承QtActivity(org.qtproject.qt.android.bindings.QtActivity),默认的QtActivity本身没有你添加的InitializeAdBanner等方法,所有广告相关方法必须在自定义子类中实现。
  • 检查CMake配置:确保Java代码目录被正确关联到APK打包流程。在CMakeLists.txt中通过qt_add_android_apk指定Android资源目录,示例:
    qt_add_android_apk(your_app_apk your_app
        ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android
        # 其他打包配置...
    )
    
  • 验证AndroidManifest.xml的Activity指向:确保android:name是你的自定义Activity,而非默认QtActivity:
    <activity android:name=".AdMobActivity"
              android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density"
              android:label="@string/app_name"
              android:screenOrientation="unspecified">
        <!-- 其他Activity配置 -->
    </activity>
    

2. 核对JNI调用的方法签名与调用方式

  • 确保QJniObject的调用签名完全匹配Java方法定义。例如Java方法:
    public void InitializeAdBanner(String adUnitId) {
        // 广告初始化逻辑
    }
    
    对应的JNI调用必须使用正确的签名和非静态调用方法:
    QJniObject activity = QNativeInterface::QAndroidApplication::context();
    QJniObject adUnitId = QJniObject::fromString("你的广告单元ID");
    activity.callMethod<void>("InitializeAdBanner", "(Ljava/lang/String;)V", adUnitId.object<jstring>());
    
  • 重点确认:非静态方法必须用callMethod,静态方法用callStaticMethod,二者不可混用。

3. 检查gradle依赖与混淆规则

  • 确认模块级build.gradle中AdMob依赖已正确同步:
    dependencies {
        implementation 'com.google.android.gms:play-services-ads:22.2.0'
        // 其他依赖项
    }
    
  • 若开启代码混淆(minifyEnabled true),需在proguard-rules.pro中添加规则避免方法被误删:
    # 保留AdMob相关类
    -keep class com.google.android.gms.ads.** { *; }
    -keep class com.google.android.gms.common.** { *; }
    # 保留Qt绑定类与自定义Activity
    -keep class org.qtproject.qt.android.bindings.** { *; }
    -keep class 你的包名.AdMobActivity { *; }
    

4. 适配Qt版本与构建工具链

  • 确认Qt版本支持QJniObject:Qt 6.2+正式引入该类,Qt 5.15仅为实验性支持,若使用Qt 5可暂时换回QAndroidJniObject测试是否解决问题。
  • 匹配gradle构建版本:play-services-ads:22.2.0要求compileSdkVersion至少为33,需在build.gradle中配置:
    android {
        compileSdkVersion 33
        defaultConfig {
            targetSdkVersion 33
            // 其他默认配置
        }
    }
    

5. 验证Java代码编译状态

  • 检查构建目录下的编译产物:确认自定义Activity的class文件存在(路径通常为build/intermediates/javac/debug/classes/你的包名/AdMobActivity.class),若不存在说明Java代码未被编译,需检查文件路径是否符合规范(应放在android/src/main/java/你的包名/下)。
  • 通过adb logcat过滤NoSuchMethodError关键词,查看完整报错信息,确认方法签名是否存在参数类型不匹配的情况(如JNI传递int但Java方法期望long)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:53:04