2014-12-01 13 views
5

Sto realizzando un'app di libreria che rileva arresti anomali in Android utilizzando il Google Breakpad. Ogni volta che la mia app principale ha un crash nativo, il breakpad richiama il seguente callback. Da questo callback, ho bisogno di chiamare un metodo static void in una classe java usando JNI.Impossibile eseguire la chiamata JNI da C++ a java in Android lollipop utilizzando 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"); 
} 

Questo è il mio metodo Java:

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

Ciò usata per funzionare bene prima di Android 5.0. Ma in Lollipop, non sono in grado di chiamare il mio metodo java perché non sono in grado di vedere il log 'inside handle exception' sulla console Logcat.

Ecco i msg di registro che vedo su logcat:

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 

Qualcuno può please help me su questo?

+1

Vedi qualche output? Qualche linea LOGE compare nel logcat? Inoltre, dovresti anche controllare il tuo codice se sono state lanciate delle eccezioni java. La mia ipotesi sarebbe una 'ClassNotFoundException'. In lollipop la VM java viene cambiata da 'dalvik' a' ART'. 'ART' è più difficile quando si tratta di nomi di classi. Assicurati che il tuo sia corretto. – tillaert

+0

Ciao, ho aggiunto alcune dichiarazioni di registro nel mio codice. Avevi ragione mentre ricevo un'eccezione dopo aver chiamato il metodo java ma non riesco a stampare un'eccezione usando ExceptionDescribe(); Ho verificato anche il nome della mia classe. Sembra essere corretto. – purnima

+0

Non è un dato di fatto che il codice di gestione degli arresti anomali nativi trovi la VM in uno stato che può essere richiamato. –

risposta

0

È un noto issue, menziona qualche soluzione, ma non è stato ancora risolto. ART utilizza uno stack alternativo per la gestione del segnale, che causa il problema.

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

L'app consuma troppa pila.

0

È possibile creare un nuovo thread nel metodo 'breakpad_callback' e quindi effettuare la chiamata JNI nella discussione. Funzionerà.