2015-02-12 3 views
0

я пишу код,JNI ERROR (приложение ошибка): локальная Переполнение справочной таблицы

jclass clazz = env -> FindClass("java/lang/System"); 
    jclass globalClass = reinterpret_cast<jclass>(env->NewGlobalRef(clazz)); 
    jmethodID methodId = env -> GetStaticMethodID(globalClass, "load", "(Ljava/lang/String;)V"); 
    jstring j_file = env -> NewStringUTF(filename.c_str()); 
    env -> CallStaticVoidMethod(globalClass, methodId, j_file); 
    if(env -> ExceptionCheck()) 
    { 
     env -> ExceptionDescribe(); 
     env -> ExceptionClear(); 
     LOG_E("Load library error!"); 
    } 
    else 
    { 
     LOG_E("load library success"); 
    } 
    env -> ReleaseStringUTFChars(j_file, filename.c_str()); 
    env -> DeleteGlobalRef(clazz); 

при запуске его, это ошибка, как

A/art(4412): 
art/runtime/indirect_reference_table.cc:113] JNI ERROR (app bug): 
local reference table overflow (max=512)` `A/art(4412): 
art/runtime/indirect_reference_table.cc:113] local reference table dump: 
Last 10 entries (of 512): 

Я не знаю, почему, вы можете помочь меня?

+0

Отпустите все. Вы не выпускаете 'j_file.' – EJP

+0

Да, это должно быть realease все как' env -> ReleaseStringUTFChars (j_file, filename.c_str()); env -> DeleteLocalRef (j_file); env -> DeleteGlobalRef (j_clazz); env -> DeleteLocalRef (clazz); ', но у него также есть проблема – user4073982

+0

Согласно ART, у вас более 512 локальных ссылок, созданных вашим кодом на C++ во время одного вызова JNI. Но это не похоже на ваш фрагмент. У вас есть что-нибудь еще? Кроме того, разместите в конце журнала отладки «Последние 10 записей». – ph0b

ответ

-1

В JNI, я переписать метод System.nativeLoad, когда я называю System.load, то System.load называют nativeLoad, так что ...

0

ReleaseStringUTFChars() не освобождает j_file. Проверьте documentation.

Необходимо позвонить по телефону DeleteLocalRef(j_env, j_file).

Смежные вопросы