繁体   English   中英

有没有办法通过JNI直接指向Java数组?

[英]Is there any way to get a direct pointer to a Java array via JNI?

我需要通过JNI获得一个包含Java数组直接内存地址的指针,而不需要调用某种复制(即直接访问)。

GetArrayElements返回一个指向复制数组的指针 - 我需要能够直接从本机层修改Java层上的int []。

jintArray转换为int*成功返回内存地址,但我不确定这是否特别稳定......?

我能在这做什么......?

您可以使用直接内存(具有本机字节顺序)的IntBuffer。 在JNI中,您可以将地址用作指针。 在Java中,您必须使用get()和put()。

也许。 您可以调用的方法可以为您提供指向Java内存的直接指针,但这取决于JVM的功能。

来自http://java.sun.com/docs/books/jni/html/objtypes.html#4099

JNI支持一系列Get / ReleaseArrayElements函数(包括,例如,Get / ReleaseIntArrayElements),它们允许本机代码获得指向原始数组元素的直接指针。 因为底层垃圾收集器可能不支持固定,所以虚拟机可以返回指向原始基元数组的副本的指针。

请注意,您需要在使用它时释放指针。

编辑:

在JDK 1.3中,添加了函数Get / ReleasePrimtiveArrayCritical()以获取直接指针,即使JVM不支持固定。

"These restrictions make it more likely that the native code will 
obtain an uncopied version of the array, even if the VM does not 
support pinning. For example, a VM may temporarily disable garbage 
collection when the native code is holding a pointer to an 
array obtained via GetPrimitiveArrayCritical."

但是,您应该尽快释放指针,并且您与JVM的交互存在限制。

另一种方法是,如果您与大型数组进行频繁但稀疏的交互,则只能使用GetArrayRegion()函数获取数组中的小区域。

另一种方法是使用GetDirectBufferAddress方法获取其地址并设置一个指向它的指针。 您可以在以下链接中找到更多信息:

double * cArr = (double *)((char *)env->GetDirectBufferAddress(inpObject));

复杂对象的GetDirectBufferAddress示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM