c++ 如果Get〈>ArrayElements返回的指针数组对应的Release〈>ArrayElements模式是JNI_COMMIT,我们应该删除/释放它吗?

4uqofj5v  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(99)

当调用JNI函数Get<PrimitiveType>ArrayElements时,它将返回一个C JNI NativeType指针数组,它可能是原始jarray的副本,也可能是直接指向jarray原始值的指针。
当模式为0JNI_ABORTjboolean输出*isCopy设置为JNI_TRUE时,它也有相应的Release<PrimitiveType>ArrayElements来释放缓冲区,但如果模式为JNI_COMMIT,则不会。
所以我的问题是,如果我们将相应的Release<PrimitiveType>ArrayElements模式设置为JNI_COMMIT,那么当我们完成Get<PrimitiveType>ArrayElements时,我们是否应该free/delete[]Get<PrimitiveType>ArrayElements返回的指针,因为这种模式不会释放缓冲区?
JNI_COMMIT复制回内容,但不释放元素缓冲区

[编辑]

我的错,我没有看到它的权利,Get<PrimitiveType>ArrayRegion不返回一个数组指针,我更新了我原来的第二个问题的主要问题。

htrmnn0y

htrmnn0y1#

我们应该释放/删除Get<PrimitiveType>ArrayRegion返回的指针吗?
不知道
该操作是一个复制操作,将数组中的 * 一些 * 数据复制到调用者提供的缓冲区中。它不“获取”或数组,也不返回指针。(文档中说返回类型为void。)
此外,与Get<PrimitiveType>ArrayElements不同,文档没有提到发布或自由方法,也没有提到任何需要发布或自由的东西。
但是,调用方负责在Get<PrimitiveType>ArrayRegion调用中提供的缓冲区的任何内存管理。
如果我们将相应的Release<PrimitiveType>ArrayElements模式设置为JNI_COMMIT,那么我们是否应该释放/删除[] Get<PrimitiveType>ArrayElements返回的指针,因为这种模式也不会释放缓冲区?
从文档中并不是100%清楚,但我的阅读是,在这种情况下,您 * 确实 * 需要释放/删除缓冲区。请注意,文档指出:

  • “其他选项[例如JNI_COMMIT]为程序员提供了对内存管理的更多控制,应特别小心使用。"*
m3eecexj

m3eecexj2#

无论原生数组是“查看”Java数组还是JVM分配的副本,都不应该在Get<PrimitiveType>ArrayElements返回的数组指针上调用free / delete[]。当您完成此数组时,您应该调用Release<PrimitiveType>ArrayElements,使用mode0JNI_ABORT
但是在Get…和final Release…之间,您可能需要同步数组的本地端和Java端。这可以通过使用mode=JNI_COMMIT调用Release…来实现。这样,在最终***释放***本地数组之前,您可以根据需要多次调用Release…
请注意,最后,您的JNI代码还应该释放对Java数组的引用。

相关问题