使用GCC编译时,JNI代码崩溃,并出现本地引用表溢出错误,使用CLang编译时,JNI代码可以正常工作

时间:2019-04-21 10:42:02

标签: android c++ gcc java-native-interface clang

我遇到一个奇怪的问题。 我有一个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 questionthis question,它们看起来与我的问题有关,但是它们很旧,可能无关紧要。我将不胜感激任何指针。

0 个答案:

没有答案