有什么办法可以通过JNI获得直接指向Java数组的指针?

 2023-01-20    299  

问题描述

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

getarrayelements返回指向复制数组的指针 – 我需要能够直接从本机层上修改Java层上的int [].

有什么办法可以通过JNI获得直接指向Java数组的指针?

从jintArray到int*成功返回内存地址,但我不确定这是否特别稳定…?

我可以在这里做什么…?

推荐答案

您可以使用直接内存(带有本机字节订单)使用intbuffer.在JNI中,您可以将地址用作指针.在Java中,您必须使用get()和put().

其他推荐答案

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

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

JNI支持一个get/reteaseAreareements功能的家族
(例如,包括获取/ReleaseIntarrayElements)允许
本地代码以获取直接指针指向原始元素
数组.因为基础垃圾收集器可能不支持
固定,虚拟机可以将指针返回到
原始原始数组.

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

编辑:

在JDK 1.3中,函数即使JVM不支持固定,get/rebeasePrimtiveArrayCritical()也会添加以获得直接指针.

"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() functions.

其他推荐答案

另一种方法是获取其地址,并使用 getDirectBufferAddress 方法设置一个指针.您可以在下面找到更多信息链接:

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

/a>

以上所述是小编给大家介绍的有什么办法可以通过JNI获得直接指向Java数组的指针?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26161.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。