在JNI中清理新对象数组的正确方法

时间:2012-08-31 01:51:04

标签: java-native-interface

如果在部分填满新阵列时发生故障,应如何处理NewObjectArray的结果?

也就是说,我想中止创作。删除对数组的本地引用是否足够?这会删除孩子吗?

2 个答案:

答案 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);