0xd*_*eef 1 c++ java-native-interface
当调用 JNI 函数时,Get<PrimitiveType>ArrayElements它将返回一个 CJNI NativeType指针数组,该数组可能是原始 JARRAY 的副本,或者是直接指向 JARRAY 原始值的指针。
Release<PrimitiveType>ArrayElements当模式为0orJNI_ABORT且jboolean输出*isCopy设置为时,它还有相应的释放缓冲区JNI_TRUE,但如果模式为 则不释放缓冲区JNI_COMMIT。
所以我的问题是,如果我们将相应的模式设置为因为该模式不会释放缓冲区,那么我们是否应该free/完成后delete[]返回的指针?Get<PrimitiveType>ArrayElementsRelease<PrimitiveType>ArrayElementsJNI_COMMIT
JNI_COMMIT 复制回内容但不释放 elems 缓冲区
[编辑]
我的缺点是我没有立即看到它Get<PrimitiveType>ArrayRegion不返回数组指针,我将原来的第二个问题更新为主要问题。
我们应该释放/删除[]返回的指针吗
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 再次调用才能释放它。