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

使用官方crashlytics.h头文件集成NDK时C++ Crashlytics运行崩溃

根因定位与修复方案

错误本质

崩溃日志中显示的ClassNotFoundException: com.google.firebase.crashlytics.FirebaseCrashlytics,来自NDK层libcrashlytics动态库的JNI桥接调用逻辑,出现该问题的核心原因有三个:

  • 项目仅集成了NDK层的crashlytics动态库,没有引入Java层的核心Firebase Crashlytics SDK。NDK层的接口实现不是独立运行的,所有上报、初始化逻辑必须依赖Java层的FirebaseCrashlytics类完成底层桥接,缺失该依赖时,native层在初始化阶段就会触发类查找失败。
  • 手动拷贝头文件的操作绕开了官方依赖的自动集成流程,导致类加载路径配置错误。日志中打印的异常类加载路径完全指向系统目录,没有包含应用APK自身的dex、native库搜索路径,就是因为没有走官方Gradle依赖引入流程,SDK自动配置的类加载桥接逻辑没有被注入到项目中。
  • 调用逻辑不符合官方设计要求。Crashlytics NDK层不需要手动调用初始化接口,其初始化流程是Java层SDK完成启动时,自动通过JNI透传触发native层初始化;手动调用firebase::crashlytics::Initialize()会直接触发native层反向查找Java类的逻辑,在类没有被正确加载的前提下必然崩溃。

分步修复操作

  • 移除手动拷贝的crashlytics头文件,通过官方Gradle依赖引入完整SDK:
    • 集成Firebase BoM统一版本管理,避免依赖版本错位
    • 引入Java层核心firebase-crashlytics依赖,补齐缺失的FirebaseCrashlytics类
    • 引入官方firebase-crashlytics-ndk依赖,该依赖会自动将对应native库、头文件路径配置到CMake构建流程中,不需要手动维护头文件拷贝逻辑
  • 删除NDK代码中的firebase::crashlytics::Initialize()调用逻辑,仅在Java层完成Firebase SDK初始化后,直接调用firebase::crashlytics::Log()接口即可,正确的代码写法参考:
    void NDKCrashlytics::logToCrashlytics(char *result) {
        // 无手动初始化步骤,SDK会自动完成桥接
        firebase::crashlytics::Log(result);
    }
    
  • 检查项目混淆规则,确保com.google.firebase.crashlytics包下的所有类没有被混淆、移除,避免Release构建后类名被篡改导致查找失败

注意:SDK版本错位也是常见触发原因,NDK桥接库和Java层SDK的版本必须严格匹配,手动拷贝的native库版本和引入的Java层版本不一致时,同样会触发类查找失败。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 20:36:01