2014-12-01 18 views
5

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?

+1

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

+0

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

+0

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. –

Trả lời

0

Nó được biết đến issue, nó đề cập đến một số giải pháp thay thế, nhưng chưa được khắc phục. ART sử dụng một ngăn xếp thay thế để xử lý tín hiệu, điều đó gây ra vấn đề.

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

Ứng dụng của bạn tiêu thụ quá nhiều ngăn xếp.

0

Bạn có thể tạo một chuỗi mới trong phương thức 'breakpad_callback' và sau đó thực hiện cuộc gọi JNI trong chuỗi. Nó sẽ hoạt động.

Các vấn đề liên quan