JAVA -JNA C 函数修改双精度数组
JAVA -JNA C function modify array of doubles
我在将一个双精度数组从 Java 传递到一个使用 JNA 的 C 函数时遇到问题,该函数通过引用该数组来修改值。
C 示例函数:
void examplefunct(double* dd) //<-- this wants an array of 6 doubles
此函数需要 6 个双精度数组,现在我已经尝试使用
DoubleByReference[] jdd = new DoubleByReference[6];
在 JNA 实现中,但我无法从数组中获取值。
老实说,我认为我的实现是不正确的,因为我是 JNA
的新手,所以一个基本的例子将不胜感激
提前致谢!
有几种方法可以映射此函数:
public interface MyLibrary extends Library {
void examplefunct(Pointer dd);
void examplefunct(java.nio.Buffer dd);
void examplefunct(double[] dd);
}
如果分配 com.sun.jna.Memory
的实例,则可以使用各种内存访问器函数将双精度值写入缓冲区。
如果直接使用NIO ByteBuffer,可以使用第二个例子
如果您使用 Java 原始数组,那么 JNA 会为您执行从 Java 到本机内存的复制。
它们中的每一个都有不同的性能特征,因此如果性能令人担忧,您应该在您的环境中进行测试。
我在将一个双精度数组从 Java 传递到一个使用 JNA 的 C 函数时遇到问题,该函数通过引用该数组来修改值。
C 示例函数:
void examplefunct(double* dd) //<-- this wants an array of 6 doubles
此函数需要 6 个双精度数组,现在我已经尝试使用
DoubleByReference[] jdd = new DoubleByReference[6];
在 JNA 实现中,但我无法从数组中获取值。 老实说,我认为我的实现是不正确的,因为我是 JNA
的新手,所以一个基本的例子将不胜感激提前致谢!
有几种方法可以映射此函数:
public interface MyLibrary extends Library {
void examplefunct(Pointer dd);
void examplefunct(java.nio.Buffer dd);
void examplefunct(double[] dd);
}
如果分配 com.sun.jna.Memory
的实例,则可以使用各种内存访问器函数将双精度值写入缓冲区。
如果直接使用NIO ByteBuffer,可以使用第二个例子
如果您使用 Java 原始数组,那么 JNA 会为您执行从 Java 到本机内存的复制。
它们中的每一个都有不同的性能特征,因此如果性能令人担忧,您应该在您的环境中进行测试。