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方法:
对应的JNI调用必须使用正确的签名和非静态调用方法:public void InitializeAdBanner(String adUnitId) { // 广告初始化逻辑 }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
相关产品推荐
相关产品推荐

