У меня странная проблема.У меня есть код 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?
Я нашел этот вопрос и этот вопрос , они выглядят связанными с моей проблемой,но они старые и, вероятно, не имеют значения.Буду благодарен за любые указатели.