Невозможно сделать вызов JNI из C ++ в Java в Android Lollipop, используя JNI

Я делаю библиотечное приложение, которое обнаруживает собственные сбои в Android с помощью Google Breakpad. Всякий раз, когда мое основное приложение имеет собственный сбой, breakpad вызывает следующий обратный вызов.
Из этого обратного вызова мне нужно вызвать статический метод void в классе Java с использованием 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");
}

Это мой метод 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

Может кто-нибудь, пожалуйста, помогите мне в этом?

5

Решение

Это известный вопрос, он упоминает некоторый обходной путь, но еще не исправлен. ART использует альтернативный стек для обработки сигналов, что вызывает проблему.

0

Другие решения

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

Ваше приложение потребляет слишком много стека.

0

Вы можете создать новый поток в методе breakpad_callback, а затем сделать вызов JNI в потоке. Он будет работать.

0