0

ドキュメントによると

jint EnsureLocalCapacity(JNIEnv *env, jint capacity);

現在のスレッドで少なくとも指定された数のローカル参照を作成できるようにします。成功した場合は 0 を返します。それ以外の場合は負の数を返し、OutOfMemoryError をスローします。

VM は、ネイティブ メソッドに入る前に、少なくとも 16 個のローカル参照を作成できることを自動的に確認します。

下位互換性のために、VM は確保された容量を超えてローカル参照を割り当てます。(デバッグのサポートとして、VM は、作成されているローカル参照が多すぎることをユーザーに警告する場合があります。JDK では、プログラマーは -verbose:jni コマンド ライン オプションを指定して、これらのメッセージを有効にすることができます。)確保された容量を超えてローカル参照を作成することはできません。

作成できる Local Reference の数に制限があるようです。

そして、大きなオブジェクト配列を返す次のコードがあります。これにより、多くのローカル参照が作成されます。これは簡単に限界に達してしまうということですか?-- ドキュメントには、デフォルトで 16 と記載されています。

extern "C" JNIEXPORT
jobjectArray JNICALL Java_MessageQueueInterop_receive(JNIEnv * env, jobject this_obj, jclass cls)
{
    int count = 99999;
    jobjectArray ret = env->NewObjectArray( count, cls, NULL);
    if( ret ){
        for( int i = 0; i < count; i++ ) {
            jobject obj = env->NewObject( cls, constructor);
            if( obj ){
            env->SetIntField( obj, fieldID1, 2);

            jstring str = env->NewStringUTF("XXX");
            if( str )
                env->SetObjectField( obj, fieldID2, str);

            env->SetObjectArrayElement( ret, i, obj);
            }
        }
    }
    return ret;
}

制限を延長するには?

4

1 に答える 1