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

0xd*_*eef 1 c++ java-native-interface

当调用 JNI 函数时,Get<PrimitiveType>ArrayElements它将返回一个 CJNI NativeType指针数组,该数组可能是原始 JARRAY 的副本,或者是直接指向 JARRAY 原始值的指针。

Release<PrimitiveType>ArrayElements当模式为0orJNI_ABORTjboolean输出*isCopy设置为时,它还有相应的释放缓冲区JNI_TRUE,但如果模式为 则不释放缓冲区JNI_COMMIT

所以我的问题是,如果我们将相应的模式设置为因为该模式不会释放缓冲区,那么我们是否应该free/完成后delete[]返回的指针?Get<PrimitiveType>ArrayElementsRelease<PrimitiveType>ArrayElementsJNI_COMMIT

JNI_COMMIT 复制回内容但不释放 elems 缓冲区


[编辑]

我的缺点是我没有立即看到它Get<PrimitiveType>ArrayRegion不返回数组指针,我将原来的第二个问题更新为主要问题。

Ste*_*n C 5

我们应该释放/删除[]返回的指针吗Get<PrimitiveType>ArrayRegion

不。

该操作是复制操作,它将数组中的一些数据复制到调用者提供的缓冲区中。它不“获取”数组,也不返回指针。(文档说返回类型是void。)

此外,与 不同的是Get<PrimitiveType>ArrayElements,该文档没有提及发布或免费方法,或者任何发布或免费任何内容的要求。

但是,调用者负责其在调用中提供的缓冲区的任何内存管理Get<PrimitiveType>ArrayRegion


Get<PrimitiveType>ArrayElements如果我们将相应的Release<PrimitiveType>ArrayElements模式设置为 ,我们是否应该释放/删除[]返回的指针,JNI_COMMIT因为该模式也不会释放缓冲区?

请参阅 Alex Cohn 的答案:/sf/answers/5317843121/JNI_COMMIT模式实际上并不释放缓冲区。您必须Release<PrimitiveType>ArrayElements 再次调用才能释放它。