有没有办法通过 JNI 将 Java 数组传递给 C 而无需复制它?

2024-04-17

据我所知,使用GetDoubleArrayElements,是JVM决定是否复制Array的元素。这种情况下,有什么办法可以避免复制呢?如果没有,有没有其他方法可以从Java转移到C而无需复制?我正在传递非常大的数组,我希望我可以避免复制。 谢谢


The JNI指南 http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html says:

在JDK/JRE 1.1中,程序员可以使用Get/ReleaseArrayElements函数来获取指向原始数组元素的指针。如果VM支持固定,则返回指向原始数据的指针;否则,将制作一份副本。

JDK/JRE 1.3 中引入的新函数允许本机代码获取指向数组元素的直接指针,即使 VM 不支持固定也是如此。

这些“新功能”是GetPrimitiveArrayCritical and ReleasePrimitiveArrayCritical它完全禁用垃圾收集,因此必须小心使用。所以总结来说这是一个VM问题而不是API问题。不要忘记,如果不固定,垃圾收集器可能会决定压缩堆并物理移动数组,因此直接指针毕竟没什么用处。

正如彼得建议的那样,你可以与java.nio.DoubleBuffer而不是使用数组。 JNI 函数

void* GetDirectBufferAddress(JNIEnv* env, jobject buf);

允许您访问它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法通过 JNI 将 Java 数组传递给 C 而无需复制它? 的相关文章

随机推荐