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