我在使用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.gradlecompileSdkVersion 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
答案 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解释开始之前很容易被忽略。