JNA를 사용하여 C에서 short **를 호출하려고합니다.JNA 2 차원 배열
는 C는 다음과 같다 : A는 단 [] [] JNA 작동하지 않는로부터 전달
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 설명서에 "기본 다차원 배열을 매핑하려면 1 차원 Java 배열을 사용합니다"라고되어 있지만 작동하지 않습니다. 전화 할 때
'nativeLib.compute (new short [] {1, 2, 3, 4}, 2, 2); 내가 얻을 : 상위를 : com.sun.jna.Native.invokeVoid (기본 방법)에서 잘못된 메모리 액세스
PointerByReference이 필요한 것으로 보인다, 내가 포함 PointerByReference으로 PointerByReference을 채우기 위해 노력 짧은 값하지만이 작동하지 않습니다
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);
하지만를 얻을 :
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);
}
는 또한 시도
누구나 아이디어가 있습니까? C 시그니처를 변경할 수 없습니다.이 짧은 것을 처리해야합니다 **
고마워요.
솔루션
나는 finnaly가 성공! 이 일을 : 결과와
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
감사합니다 많이!
"포인터의 배열"버전이 당신을 위해 일해 준 것을 기쁘게 생각합니다! –