Сбои в GetArrayLength jni - PullRequest
       6

Сбои в GetArrayLength jni

0 голосов
/ 27 июня 2018

Мы получаем множество сбоев при GetArrayLength методе в jni. Ошибка не воспроизводится ни в одной ситуации. При отладке GetArrayLength работает правильно. Я не могу найти точное решение для этой проблемы. Этот сбой происходит во всех версиях Android, однако выкладываю журнал сбоя в Android 8.

#00  pc 0000000000039190  /system/lib/libc.so (tgkill+12)
#01  pc 0000000000013b41  /system/lib/libc.so (pthread_kill+52)
#02  pc 000000000001475f  /system/lib/libc.so (raise+10)
#03  pc 0000000000010fdd  /system/lib/libc.so 
(__libc_android_abort+36)
#04  pc 000000000000f53c  /system/lib/libc.so (abort+4)
#05  pc 000000000021fc55  /system/lib/libart.so 
(_ZN3art7Runtime5AbortEv+160)
#06  pc 00000000000a841b  /system/lib/libart.so 
(_ZN3art10LogMessageD1Ev+1322)
#07  pc 000000000022ffb5  /system/lib/libart.so
(_ZN3art6Thread9DumpStateERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEPKS0_i+1724)
  #08  pc 00000000002302f9  /system/lib/libart.so (_ZNK3art6Thread4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE+16)
  #09  pc 000000000023944d  /system/lib/libart.so (_ZN3art10ThreadList10DumpLockedERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE+104)
  #10  pc 000000000021f9b1  /system/lib/libart.so (_ZN3art10AbortState4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE+236)
  #11  pc 000000000021fbfd  /system/lib/libart.so (_ZN3art7Runtime5AbortEv+72)
  #12  pc 00000000000a841b  /system/lib/libart.so (_ZN3art10LogMessageD1Ev+1322)
  #13  pc 00000000000b2231  /system/lib/libart.so (_ZN3artL8JniAbortEPKcS1_+1060)
  #14  pc 00000000000b2789  /system/lib/libart.so (_ZN3art9JniAbortFEPKcS1_z+60)
  #15  pc 00000000001c3843  /system/lib/libart.so (_ZN3art3JNI14GetArrayLengthEP7_JNIEnvP7_jarray+634)

Вот фрагмент кода, где происходит сбой:

void report_gl_error(int code, gl_error **errors_hash, bool unrecoverable) {
    native_shim *shim = get_native_shim();
    jmethodID method = shim->env->GetMethodID(shim->type, "reportGlError", "(I)[I");
    jint error = code;
    jintArray gl_errors_arr = (jintArray)shim->env->CallObjectMethod(shim->instance, method, error);

    if (shim->env->ExceptionCheck()) {
        shim->env->ExceptionDescribe();
        shim->env->ExceptionClear();
        return;
    }

    int length = shim->env->GetArrayLength(gl_errors_arr);
    int *error_arr = (int*) shim->env->GetIntArrayElements(gl_errors_arr, 0);

    for (int i = 0; i < length; i++) {
        int err = (int) error_arr[i];
        gl_error *error_obj = (gl_error *)malloc(sizeof(gl_error));
        error_obj->error_code = err;
        HASH_ADD_INT(*errors_hash, error_code, error_obj);
    }
    shim->env->ReleaseIntArrayElements(gl_errors_arr, error_arr, 0);

    if (unrecoverable) {
        jmethodID method = shim->env->GetMethodID(shim->type, "logNativeError", "()V");
        shim->env->CallVoidMethod(shim->instance, method);
    }
    }

Edit: Метод get_native_shim будет в основном вызывать get_env метод

static JNIEnv* get_env() {
JNIEnv* env;
static_vm->AttachCurrentThread(&env, NULL);
nativereturn env;
}

Полный код можно посмотреть здесь:

core.c

native_shim.cpp

...