2023-01-20 299
我需要通过JNI获取包含Java数组的直接内存地址的指针,而无需调用某种复制(即直接访问).
getarrayelements返回指向复制数组的指针 – 我需要能够直接从本机层上修改Java层上的int [].
从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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态