如果在部分填满新阵列时发生故障,应如何处理NewObjectArray
的结果?
也就是说,我想中止创作。删除对数组的本地引用是否足够?这会删除孩子吗?
答案 0 :(得分:3)
除非将其分配给Java字段或用作JNI函数返回值,否则一旦本机调用返回,引用将自动进行垃圾收集。这是一个本地参考 - 那些没有超过JNI电话的人。
答案 1 :(得分:0)
我在查找同一主题(jobjectArray
发布)时偶然发现了这个问题,我发现@Seva提供的答案并不完整。
您可以删除jobjectArray LocalRef
,就像其他任何LocalRef
一样,使用:
env->DeleteLocalRef(the_array);
// OR
(*env)->DeleteLocalRef(env, the_array);
当然,与任何其他LocalRef
一样,您可以避免手动删除并依赖GC为您执行魔术,但如果您需要在同一个JNI函数中使用其中许多,或者,例如,您'正在运行一个循环,分配新的JNI LocalRef
并且你没有删除它们,一旦它们超出表限制(非常低,设置为512),你将会遇到不好的时间。
注
如果您要手动删除数组引用,则需要记住DeleteLocalRef
上的jobjectArray
函数不会释放其子元素。
因此,当您使用jobjectArray
时,您需要跟踪元素或循环遍历所有元素并逐个删除它们。
primitive 数组也是如此,但对于这些数组,你有
env->Release<Primitive>ArrayElements(the_array,
the_elements_to_remove,
release_mode);
// OR
(*env)->Release<Primitive>ArrayElements(env,
the_array,
the_elements_to_remove,
release_mode);