根据文档
jint EnsureLocalCapacity(JNIEnv *env, jint 容量);
确保可以在当前线程中创建至少给定数量的本地引用。成功返回 0;否则返回负数并抛出 OutOfMemoryError。
在进入本机方法之前,VM 会自动确保至少可以创建 16 个本地引用。
为了向后兼容,VM 分配的本地引用超出了确保的容量。(作为调试支持,VM 可能会警告用户正在创建过多的本地引用。在 JDK 中,程序员可以提供 -verbose:jni 命令行选项来打开这些消息。)VM 调用 FatalError 如果不能再创建超出确保容量的本地引用。
似乎可以创建的本地引用的数量有一些限制。
而且我有以下代码来返回一个大对象数组,这会导致大量本地引用的创建。这是否意味着这很容易达到限制?-- 文档默认为 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;
}
如何延长限制?