【问题标题】:C++ Crashlytics NDK crashes when used with header与标头一起使用时 C++ Crashlytics NDK 崩溃
【发布时间】:2021-04-04 17:32:31
【问题描述】:

我遵循了此处列出的所有步骤:crashlytics NDK Android

我将此文件复制粘贴到我的项目中:crashlytics.h

我是这样称呼它的:

#include "Crashlytics.h"
    
void NDKCrashlytics::logToCrashlytics(char *result) {
    firebase::crashlytics::Initialize();
    firebase::crashlytics::Log(result);
}

只要我调用该方法,我的应用就会崩溃,这是我得到的日志:

E/AndroidRuntime(20818):致命异常:Thread-10 E/AndroidRuntime(20818):进程:com.insync.loopad,PID:20818 E/AndroidRuntime(20818): java.lang.ClassNotFoundException: 没找到 路径上的类“com.google.firebase.crashlytics.FirebaseCrashlytics”: DexPathList[[目录“.”],nativeLibraryDirectories=[/system/lib64, /system/lib64]] E/AndroidRuntime(20818): 在 dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196) E/AndroidRuntime(20818):在 java.lang.ClassLoader.loadClass(ClassLoader.java:379) E/AndroidRuntime(20818):在 java.lang.ClassLoader.loadClass(ClassLoader.java:312) 2(灰名单, 链接,允许) D/libcrashlytics(20818):初始化 libcrashlytics 3.0.0版

我也看到了这个问题here,但没有解决。我做错了什么?

【问题讨论】:

  • 查看您的 APK。 你能找到com.google.firebase.crashlytics.FirebaseCrashlytics的班级吗?如果它不存在,例如如果它被 ProGuard 重命名或优化,这将导致您抱怨的崩溃。
  • 谢谢,我决定不使用它,因为在 github 问题中它说 the native API mechanism uses reflection to find certain classes; this fails if those classes are obfuscated in any way. 我会混淆我的应用程序,如果我没记错的话,我认为这会破坏这个假设,所以在任何一个万一它不适用于我的应用程序
  • 这仅与 crashlititycs 提供的少数类有关;无论如何,混淆com.google.firebase.crashlytics 包没有什么价值。因此,如果您在 proguard-rules.pro 中排除它,您仍然可以使用 NDKCrashlytics,同时混淆您应用的敏感类。
  • 感谢您分享智慧。你说的很对。

标签: android android-ndk


【解决方案1】:

在 C++ 方面(将 com_xxx_lib 替换为您的包 ID):

#include "Crashlytics.h"
extern "C"
{
    JNIEXPORT void JNICALL
    Java_com_xxx_lib_MyNativeActivity_jniCrashlyticsInit(JNIEnv * env ) {
        firebase::crashlytics::Initialize();
    }
}
void CrashlyticsLog(char const *msg)
{
    firebase::crashlytics::Log(msg);
}

在 Java 方面: 在 NativeActivity 的 onCreate() 中调用 jniCrashlyticsInit()

public class MyNativeActivity extends NativeActivity
{
    static {
        System.loadLibrary("XXX");//your c++ library
    }
    public native void jniCrashlyticsInit();

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        jniCrashlyticsInit();
    }
}

之后,您可以在 C++ 代码中使用 firebase::crashlytics::Log(msg)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    相关资源
    最近更新 更多