【发布时间】:2017-03-13 00:55:13
【问题描述】:
我尝试用 JNA 在 C 中调用一个 short**。
C 看起来像这样:
void compute(short** in, int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf("in[%d][%d] = %d\n", i,j, in[i][j]);
}
}
}
从 JNA 传递一个 short[][] 不起作用。
-
JNA 文档说“要映射本机多维数组,请使用一维 Java 数组”,但它不起作用。调用时
'nativeLib.compute(new short[] { 1, 2, 3, 4 }, 2, 2); 我得到:java.lang.Error: com.sun.jna.Native.invokeVoid(Native Method) 的内存访问无效
-
似乎需要一个 PointerByReference,我尝试用包含短值的 PointerByReference 填充 PointerByReference 但它不起作用:
Pointer pointerOfArray = new Memory(row * col * Native.getNativeSize(Short.TYPE)); for(int i=0;i<row;i++) { Pointer pointer = new Memory(col * Native.getNativeSize(Short.TYPE)); for(int j=0;j<col;j++) { pointer.setShort(j*Native.getNativeSize(Short.TYPE), in[i][j]); } pointerOfArray.setPointer(i*row*Native.getNativeSize(Short.TYPE), pointer); } -
我也试过了:
Pointer pointer = new Memory(4*Short.SIZE); Pointer pointer1 = new Memory(2*Short.SIZE); pointer1.setShort(0,(short)1); pointer1.setShort(Short.SIZE,(short)2); Pointer pointer2 = new Memory(2*Short.SIZE); pointer2.setShort(0,(short)3); pointer2.setShort(Short.SIZE,(short)4); pointer.setPointer(0, pointer1); pointer.setPointer(2*Short.SIZE, pointer2); nativeLib.compute(new PointerByReference(pointer), 2,2);
但我得到in[0][0] = 3184
in[0][1] = 10460
in[1][0] = 3344
in[1][1] = 10460
有人有想法吗?我不能改C签名,我要处理这个短**
非常感谢。
解决方案
我终于成功了!这样做:
short[][] in = {
{1,2,3},
{4,5,6},
};
Pointer[] data = new Pointer[in.length];
for(int i=0;i<in.length;i++) {
data[i] = new Memory(2*Short.SIZE);
data[i].write(0, in[i], 0,in[0].length);
}
nativeLib.compute(data, in.length,in[0].length);
结果:
in[0][0] = 1
in[0][1] = 2
in[0][2] = 3
in[1][0] = 4
in[1][1] = 5
in[1][2] = 6
非常感谢!
【问题讨论】:
-
很高兴看到“指针数组”版本对您有用!