无法初始化Crashlytics NDK

时间:2017-11-14 11:46:38

标签: crashlytics crashlytics-android

我在使用Crashlytics for Android时遇到了问题。 Java部分正常工作,但我无法使NDK部分工作,因为crashlytics_init()返回空值;

我的项目/ build.gradle

buildscript {
    repositories {
        jcenter()
        google()
        maven {
            url 'https://maven.fabric.io/public'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
        classpath 'io.fabric.tools:gradle:1.24.4'
        classpath 'com.google.gms:google-services:3.1.0'
    }
}

allprojects {
    repositories {
        jcenter()
        google()

        maven {
            url 'https://maven.fabric.io/public'
        }

    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

包含

的app / build.gradle
compileSdkVersion 26

android {

    defaultConfig {
        ...
        minSdkVersion 19
        targetSdkVersion 22
        ...
    }

    ...
}

crashlytics {
    enableNdk true
    manifestPath 'C:\\full\\path\\to\\manifest\\AndroidManifest.xml'
}

dependencies {
    implementation 'com.google.firebase:firebase-crash:11.6.0'
    compile fileTree(include: ['*.jar'], dir: 'libs')

    compile('com.crashlytics.sdk.android:crashlytics:2.7.1@aar') {
        transitive = true
    }
    compile('com.crashlytics.sdk.android:crashlytics-ndk:1.1.6@aar') {
        transitive = true;
    }

    compile 'com.google.firebase:firebase-core:11.6.0'

    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:26.1.0'
    compile 'com.android.support:support-v4:26.1.0'
    compile 'org.apache.commons:commons-compress:1.12'
    compile 'org.tukaani:xz:1.5'
}

主要活动代码

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    jniCrashlyticsInit();

    ...
}

和jniCrashlyticsInit()的原生内容

void Java_com_my_app_MainActivity_jniCrashlyticsInit(JNIEnv *env,
                                                     jobject thiz)
{
    crashlytics = crashlytics_init();

    if (crashlytics == NULL)
        log("CRASHLYTICS NULL");
    else
        log("CRASHLYTICS NON NULL");
}

如您所想,记录“CRASHLYTICS NULL”并且无法初始化所有内容。 我已将日志也放在crashlytics.h内,并且它在此行上发生故障(返回空值)

__crashlytics_unspecified_t* ctx = ((__crashlytics_initialize_t) sym_ini)();

由于我没有进一步的信息,我真的不知道如何继续。 想法?

更多信息: 我使用Android studio 3.0.0,并使用以下命令手动编译NDK库

/cygdrive/c/Android/ndk-r15c/ndk-build.cmd NDK_DEBUG=0 APP_BUILD_SCRIPT=./Android.mk NDK_PROJECT_PATH=. APP_PLATFORM=android-19    

**** 11月20日更新****

根据Todd Burner的建议,我从“编译”切换到build.gradle上的“implementation”

compile('com.crashlytics.sdk.android:crashlytics:2.7.1@aar') {
    transitive = true
}
compile('com.crashlytics.sdk.android:crashlytics-ndk:1.1.6@aar') {
    transitive = true;
}

implementation('com.crashlytics.sdk.android:crashlytics:2.7.1@aar') {
    transitive = true
}
implementation('com.crashlytics.sdk.android:crashlytics-ndk:1.1.6@aar') {
    transitive = true;
}
然后我跑了

./gradlew assemble --refresh-dependencies

不幸的是,crashlytics_init()仍然返回NULL

1 个答案:

答案 0 :(得分:0)

我在同样的问题上度过了艰难的日子。在我的情况下,我会部分归咎于Fabric网站上那些不太全面的文档,部分原因是缺乏阅读理解能力。

我无法确定您是否遇到过同样的问题,但我的问题是我尝试加载两次Crashlytics NDK。

如果你像这样从java进行初始化:

Fabric.with(this, new Crashlytics(), new CrashlyticsNdk()); 

本地Crashlytics会自动加载,您不需要从C ++初始化Crashlytics 。如果您从CrashlyticsNdk.class开始逐步使用反编译的Crashlytics .class文件,则可以看到JniNativeApi.class已调用System.loadLibrary("crashlytics")

事实上,如果您仍然尝试在此之后从本机端初始化Crashlytics,那么

__crashlytics_unspecified_t* ctx = ((__crashlytics_initialize_t) sym_ini)();

将返回NULL,因为库已经加载。

让我感到困惑的是,Official Fabric documentation并没有用明亮的红色闪烁字母说,如果你从Java调用new CrashlyticsNdk(),你就不应该尝试从C ++加载本机Crashlytics 。公平地说,文档确实说了以下内容:在通过Fabric.with()进行初始化的过程中,NDK Kit使用System.loadLibrary加载libcrashlytics。但它是单行右键在Native API解释开始之前很容易被忽略。