Tôi đang tạo ứng dụng thư viện phát hiện sự cố bản địa trong Android bằng cách sử dụng Google breakpad. Bất cứ khi nào ứng dụng chính của tôi gặp sự cố nguyên bản, bảng điều khiển sẽ gọi lại cuộc gọi lại sau. Từ lời gọi lại này, tôi cần gọi phương thức void tĩnh trong một lớp java bằng cách sử dụng JNI.Không thể thực hiện cuộc gọi JNI từ C++ sang java trong android lollipop bằng cách sử dụng 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");
}
Đây là phương pháp java của tôi:
package com.abc;
public class Myclass {
public static void handleException() {
System.out.println("inside handle exception");
}
}
này được sử dụng để làm việc tốt trước khi Android 5.0. Nhưng trong Lollipop, tôi không thể gọi phương thức java của mình vì tôi không thể nhìn thấy nhật ký 'bên trong xử lý ngoại lệ' trên bảng điều khiển Logcat.
Sau đây là các thông điệp log tôi nhìn thấy trên 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
Ai đó có thể vui lòng giúp tôi về vấn đề này?
Bạn có thấy bất kỳ đầu ra nào không? Có bất kỳ dòng LOGE nào hiển thị trong logcat không? Ngoài ra, bạn cũng nên kiểm tra mã của bạn nếu có bất kỳ ngoại lệ java nào đã được ném. Tôi đoán là 'ClassNotFoundException'. Trong lollipop, máy ảo Java được thay đổi từ 'dalvik' thành' ART'. 'ART' là sticter khi nói đến tên lớp. Hãy chắc chắn rằng bạn là chính xác. – tillaert
Xin chào, tôi đã thêm một số câu lệnh đăng nhập vào mã của mình. Bạn đã đúng khi tôi nhận được ngoại lệ sau khi gọi phương thức java nhưng tôi không thể in ngoại lệ bằng cách sử dụng ExceptionDescribe(); Đồng thời xác minh tên lớp của tôi. Nó có vẻ đúng. – purnima
Nó không phải là một cho rằng mã xử lý sự cố bản địa của bạn sẽ tìm thấy VM trong một trạng thái có thể được gọi vào. –