4

How should the result of NewObjectArray be handled if a failure occurs while partially filling up the new array?

That is, I want to abort the creation. Is it sufficient to delete the local reference to the array? Will this remove the children, as well?

4

2 回答 2

4

除非它被分配给 Java 字段或用作 JNI 函数返回值,否则一旦本机调用返回,引用将自动被垃圾收集。这是一个本地参考 - 那些不会超过 JNI 调用。

于 2012-08-31T01:56:47.690 回答
0

我在查找同一主题(jobjectArray发布)时偶然发现了这个问题,我注意到@Seva 提供的答案并不完整。

可以jobjectArray LocalRef像其他任何 一样删除LocalRef,使用:

env->DeleteLocalRef(the_array);
// OR
(*env)->DeleteLocalRef(env, the_array);

当然,与任何其他 一样LocalRef,您可以避免手动删除并依靠 GC 为您执行魔法,但如果您在同一个 JNI 函数中需要其中的许多,或者,例如,您正在运行一个分配新的循环JNILocalRef并且您不会删除它们,一旦它们超出表限制(非常低,设置为 512),您将度过一段糟糕的时光。

笔记

如果您要手动删除数组引用,您需要记住DeleteLocalRefa 上的函数jobjectArray不会释放其子元素。

因此,当您使用时,jobjectArray您需要跟踪元素或遍历所有元素并一一删除。

原始数组也是如此,但对于这些你有

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);
于 2017-05-19T10:03:39.097 回答