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

时间:2011-03-08 11:05:56

标签: java java-native-interface

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

1 个答案:

答案 0 :(得分:4)

JNI guide说:

  

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

     

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

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

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

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

允许您访问它。