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

2022-09-04 22:56:57

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


答案 1

JNI指南说:

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

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

这些“新功能”完全禁用了垃圾回收,因此必须谨慎使用。因此,总而言之,这是一个VM问题,而不是API问题。不要忘记,如果不固定垃圾回收器,垃圾回收器可能会决定压缩堆并物理移动数组,因此直接指针毕竟没有什么用处。GetPrimitiveArrayCriticalReleasePrimitiveArrayCritical

正如 Peter 所建议的那样,您可以使用 a 而不是数组。JNI 函数java.nio.DoubleBuffer

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

允许您访问它。


答案 2

推荐