我正在制作一个图书馆应用程序,使用谷歌破解程序检测Android中的本机崩溃。每当我的主应用程序发生本机崩溃时,breakpad都会调用以下回调。 从这个回调中,我需要使用JNI在java类中调用静态void方法。
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");
}
这是我的java方法:
package com.abc;
public class Myclass {
public static void handleException() {
System.out.println("inside handle exception");
}
}
这在Android 5.0之前用得很好。但是在Lollipop中,我无法调用我的java方法,因为我无法在Logcat控制台上看到“内部处理异常”日志。
以下是我在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
有人可以帮我解决这个问题吗?
答案 0 :(得分:0)
JNI WARNING: java.lang.StackOverflowError thrown while calling printStackTrace
您的应用消耗了太多筹码。
答案 1 :(得分:0)
你可以在'breakpad_callback'方法中创建一个新线程,然后在线程中进行JNI调用。它会工作。
答案 2 :(得分:0)
这是一个众所周知的issue,它提到了一些解决方法,但还没有修复。 ART使用备用堆栈进行信号处理,从而导致问题。