我遇到一个奇怪的问题。 我有一个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 for Android API 27编译时可以正常工作,但在使用gcc进行Android API 21的gcc编译时崩溃,并出现错误
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?
我找到了this question和this question,它们看起来与我的问题有关,但是它们很旧,可能无关紧要。我将不胜感激任何指针。