ドキュメントによると
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;
}
制限を延長するには?