Java 및 JNA에 초보자입니다. JNA를 사용하여 Java에서 원시 DLL 함수를로드하고 사용합니다.JNA 문제 - Java에서 채워지는 배열의 일부만 DLL에 의해 사용됩니다.
배열에 포인터를 전달할 때 문제가 있습니다. 스펙대로,이 배열을 Java에서 채우고이 배열에 대한 포인터를 DLL에 보내려고합니다.
이 네이티브 호출 모습입니다,
StartCom(UNUM8 *pCoPData)
From the spec: pCoPData -> Reference of the buffer holding the data
Correspoding JNA 매핑, 나는 위의 코드를 실행하면
int[] buf = new int[2];
buf[0] = 0x1A;
buf[1] = 0x10;
Pointer pCoPData = new Memory(8);
pCoPData.write(0, buf, 0, buf.length);
Library.INSTANCE.StartCom(pCoPData);
내가 DLL 로그에서 발견 그의 첫 번째 요소 배열 0x1A가 사용되고 두 번째 바이트는 무시됩니다. DLL은 항상 배열의 첫 번째 요소 만 봅니다.
나는이 문제가 발생할 수 있습니다 만 2 possibilies이있을 수 있습니다 가정입니다,
1. The above approach I have taken to populate and send the address of a Java array to the DLL is incorrect.
2. The DLL is expecting a UNUM8* whereas I am sending a UNUM32*. I will try with byte[] instead of int[] and see if there is any difference.
어떤 제안은 큰 도움이 무엇입니까? 저에게 알려주세요. 미리 많은 감사드립니다!
고맙습니다 technomage. 앞서 언급 한 것처럼, 네이티브 코드는 함수 호출 범위를 넘어서 필요로하지 않기 때문에 바이트 []에 대한 포인터를 만들지도 않았습니다. 그 GC'd 경우 확인. byte []를 사용하는 것은 이미 참조 유형이므로 직접 작업했습니다. 메모리 사용에 대한 데이터 유형에 대한 자세한 설명과 강조에 다시 한 번 감사드립니다. – user1724114