JNI-код падает с ошибкой переполнения локальной ссылочной таблицы при компиляции с GCC, отлично работает при компиляции с CLang - PullRequest
0 голосов
/ 21 апреля 2019

У меня странная проблема.У меня есть код JNI (очень упрощенный для ясности), который выглядит следующим образом

void Foo::Bar(int count)
{
....
    jclass javaClass1 = (jclass)env->FindClass("MyJavaClass1");
    jmethodID constrObject1 = env->GetMethodID(javaClass1, "<init>", "()V");
...
    jclass javaClassN = (jclass)env->FindClass("MyJavaClassN");
    jmethodID constrObjectN = env->GetMethodID(javaClassN, "<init>", "()V");
    for (int i = 0; i < count; i++)
    {
        env->PushLocalFrame(256 ) ;
        jobject jniObject1 = env->NewObject(javaClass1, constrObject1);
...
        jobject jniObjectN = env->NewObject(javaClassN, constrObjectN);
        doSomething(<some objects created above>);
        doSomethingElse(<some objects created above>);
        doSomethingThird(<some objects created above>);
        env->PopLocalFrame(0);
    }
}

Этот код работает нормально при компиляции с CLang для Android API 27, но вылетает при компиляции с gcc для Android API 21 с ошибкой

01-01 03:23:26.714 715 715 F DEBUG : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- 
01-01 03:23:26.736 715 715 F DEBUG : Abort message: 'art/runtime/indirect_reference_table.cc:115] JNI ERROR (app bug): local reference table overflow (max=512)' 

Я знаю, что означает эта ошибка, и использую PushLocalFrame / PopLocalFrame, чтобы предотвратить ее.Я спрашиваю: почему этот код работает с CLang, но не работает с gcc?Я что-то пропустил?Или, возможно, проблема в том, что API 21 против API 27?

Я нашел этот вопрос и этот вопрос , они выглядят связанными с моей проблемой,но они старые и, вероятно, не имеют значения.Буду благодарен за любые указатели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...