有没有办法通过JNI将Java数组传递给C而不复制它?
我知道使用GetDoubleArrayElements,JVM决定是否复制Array的元素。 在这种情况下,有没有办法避免副本? 如果没有,是否有其他方式从Java转移到C而不复制? 我正在传递非常大的arrays,我希望我能避开副本。 谢谢
JNI指南说:
在JDK / JRE 1.1中,程序员可以使用Get / ReleaseArrayElements函数来获取指向原始数组元素的指针。 如果VM支持固定,则返回指向原始数据的指针 ; 否则,制作副本。
JDK / JRE 1.3中引入的新function允许本机代码获取指向数组元素的直接指针,即使VM不支持固定。
这些“新函数”是GetPrimitiveArrayCritical
和ReleasePrimitiveArrayCritical
,它们完全禁用垃圾收集,因此必须小心使用。 总而言之,这是一个VM问题而不是API问题。 不要忘记,如果没有固定垃圾回收器可能会决定压缩堆并物理移动你的数组,所以直接指针毕竟没用。
正如Peter建议您可以使用java.nio.DoubleBuffer
而不是使用数组。 JNIfunction
void* GetDirectBufferAddress(JNIEnv* env, jobject buf);
允许您访问它。