2012-10-12 1 views
1

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. 

어떤 제안은 큰 도움이 무엇입니까? 저에게 알려주세요. 미리 많은 감사드립니다!

답변

1

잘못된 형식의 입력을 입력에 전달할 때 적절한 결과가 기대되는 이유는 무엇입니까?

함수가 하나 이상의 8 비트 요소 (Java에서 byte, 아마도 UNUM8은 네이티브 코드에서 8 비트)에 대한 포인터를 예상하는 경우 하나 이상의 포인터에 해당하는 포인터를 전달해야합니다. 비트 요소. 두 개의 32 비트 요소로 초기화 한 메모리에 포인터를 전달하고 있습니다. 여기에서 (모든 값은 8 비트 바이트를 나타낸다) 메모리는 8 비트 32 비트 VS 경우의 모습이다 두 작성 후

base+0x0: 0x1A 
base+0x1: 0x10 

:

메모리에 2 개의 8 비트 값을 기입 한 후 메모리에 32 비트 값 :

base+0x0: 0x1A 0x00 0x00 0x00 
base+0x4: 0x10 0x00 0x00 0x00 

그래서 당신은 네이티브 코드가 base에서 읽기 시작하면, 그것은 보는 값이 메모리를 초기화하는 방법에 따라 크게 다르다는 것을 알 수 있습니다. 네이티브 코드가이 기능 이상에 전달하는 메모리 호출 자체에 대한 참조를 유지하는 하지 필요 않는 경우

BTW, 당신은 오히려 할당하고 Memory를 초기화하지 않고, UNUM8* 매개 변수로 byte[]를 사용할 수 있습니다.

+0

고맙습니다 technomage. 앞서 언급 한 것처럼, 네이티브 코드는 함수 호출 범위를 넘어서 필요로하지 않기 때문에 바이트 []에 대한 포인터를 만들지도 않았습니다. 그 GC'd 경우 확인. byte []를 사용하는 것은 이미 참조 유형이므로 직접 작업했습니다. 메모리 사용에 대한 데이터 유형에 대한 자세한 설명과 강조에 다시 한 번 감사드립니다. – user1724114