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

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

JNI指南说:

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

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

这些“新函数”是GetPrimitiveArrayCriticalReleasePrimitiveArrayCritical ,它们完全禁用垃圾收集,因此必须小心使用。 总而言之,这是一个VM问题而不是API问题。 不要忘记,如果没有固定垃圾回收器可能会决定压缩堆并物理移动你的数组,所以直接指针毕竟没用。

正如Peter建议您可以使用java.nio.DoubleBuffer而不是使用数组。 JNIfunction

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

允许您访问它。