2014-12-01 4 views
5

Anruf machen Ich mache eine Bibliothek App, die native Abstürze in Android mit Google Breakpad erkennt. Immer wenn meine Hauptanwendung einen systemeigenen Absturz hat, ruft breakpad den folgenden Callback auf. Von diesem Rückruf muss ich eine statische Void-Methode in einer Java-Klasse mit JNI aufrufen.Kann nicht JNI von C++ zu Java in Android Lollipop mit jni

bool breakpad_callback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded) { 

JNIEnv* env = NULL; 

if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) 
{ 
    if(isDebug) 
     LOGI("Failed to get the environment"); 
    return false; 
} 

if(isDebug) 
    LOGI("attaching thread ..."); 
vm->AttachCurrentThread(&env, NULL); 

if(isDebug) 
    LOGI("handle exception"); 

ExceptionHandlerClass = (jclass)env->NewGlobalRef(env->FindClass("com/abc/Myclass")); 
     if (ExceptionHandlerClass == NULL) 
      LOGE("Could not find java class"); 

ExceptionHandlerMethod = env->GetStaticMethodID(ExceptionHandlerClass, "handleException", "()V"); 
     if (ExceptionHandlerMethod == NULL) 
      LOGE("Could not bind exception handler method"); 

// handle exception 
env->CallStaticVoidMethod(ExceptionHandlerClass, ExceptionHandlerMethod); 

if(env->ExceptionCheck()) { 
    LOGI("got exception"); 
    env->ExceptionDescribe();  
} 


if(isDebug) 
    LOGI("exception handled"); 
} 

Das ist mein Java-Methode:

package com.abc; 
public class Myclass { 
    public static void handleException() { 
    System.out.println("inside handle exception"); 
    } 
} 

Das verwendete Fein 5,0 vor Android zu arbeiten. Aber in Lollipop kann ich meine Java-Methode nicht aufrufen, da ich nicht in der Logcat-Konsole die Meldung 'Inside Handle Exception' sehen kann.

Hier sind die Log-Nachr ich auf logcat sehen:

12-01 13:57:46.617: I/AACRNative(1617): attaching thread ... 
12-01 13:57:46.617: I/AACRNative(1617): handle exception 
12-01 13:57:46.619: I/AACRNative(1617): got exception 
12-01 13:57:46.620: W/art(1617): JNI WARNING: java.lang.StackOverflowError thrown while calling printStackTrace 
12-01 13:57:46.620: I/AACRNative(1617): exception handled 

Kann jemand bitte helfen Sie mir auf diesem?

+1

Sehen Sie einen Ausgang? Wird eine der LOGE-Zeilen im Logcat angezeigt? Außerdem sollten Sie Ihren Code einchecken, wenn Java-Ausnahmen ausgelöst wurden. Meine Vermutung wäre eine 'ClassNotFoundException'. In Lollipop wird die Java VM von 'dalvik' in' ART' geändert. 'ART' ist stikter, wenn es um Klassennamen geht. Stellen Sie sicher, dass Ihre Angaben korrekt sind. – tillaert

+0

Hallo, ich habe einige Log-Anweisungen in meinem Code hinzugefügt. Sie hatten Recht, da ich nach dem Aufruf der Java-Methode eine Ausnahme erhalte, aber ich bin nicht in der Lage, eine Ausnahme mithilfe von ExceptionDescribe() zu drucken; Auch verifiziert mein Klassenname. Es scheint richtig zu sein. – purnima

+0

Es ist nicht selbstverständlich, dass Ihr systemeigener Crash-Code die VM in einem Zustand findet, in dem sie aufgerufen werden kann. –

Antwort

0

Es ist eine bekannte issue, es erwähnt einige Abhilfe, wurde aber noch nicht behoben. ART verwendet einen alternativen Stapel für die Signalverarbeitung, der das Problem verursacht.

0
JNI WARNING: java.lang.StackOverflowError thrown while calling printStackTrace 

Ihre App verbrauchen zu viel Stapel.

0

Sie können einen neuen Thread in der Methode 'breakpad_callback' erstellen und dann JNI im Thread aufrufen. Es funktioniert.