2012-10-16 1 views
1

Windows에서 자바 소켓을 통해 타사 TCP 데이터가 들어 왔으며 해당 소켓에서 제공하는 C 라이브러리로 데이터를 전달하는 방법을 파악하려고합니다. 동일한 제 3 자 - JNA 사용 JNA/JNI/C 등 모든 것을 처음 접했습니다.소켓 데이터를 무효화 된 JNA 함수에 전달 * 매개 변수

타사 라이브러리는 소켓에서 수신 바이트를 가져 와서 올바른 메시지 유형으로 디코딩합니다. 들어오는 데이터는 임의의 길이이고 종료 구분 기호가 없으며 시작 구분 기호가 매우 짧습니다 (데이터의 가운데에 나타날 수 있으며 실제 구분 기호가 아님). 실제로 이것을 사용하는 방법을 파악하는 것이 더 쉽습니다 JNA 대신 라이브러리를 사용하여 (또는 C 언어를 배우십시오.)

저는 C 헤더 파일에서 소스 코드를 생성하기 위해 jnaerator를 사용할 수있었습니다. 또한 매개 변수가 필요없는 간단한 C 함수를 성공적으로 호출했습니다. 그러나 "원래 데이터"를 원래 void 포인터를 허용 한 C 함수에 전달해야하는 함수를 사용하려고 할 때 어떻게 처리해야할지 모르겠습니다.

다음은 코드의 관련 스 니펫입니다.

//CExportTypes.h 
typedef unsigned int XUint; 
//also defines structs: XMessageType, XCrypto, XAlarm, etc. 

//CLibrary.h 
XStatus XGetMessageType(void* bytesRecv, XUint numBytes, XMessageType* type, XUint* serial, XUint* msgLen); 
XStatus XDecodeAlarm(void* bytesRecv, XUint numBytes, XCrypto* key, XAlarm* decodedAlarm); 

//CLibrary.java (Generated) 
int XGetMessageType(Pointer bytesRecv, int numBytes, IntBuffer type, IntBuffer serial, IntBuffer msgLen); 
int XDecodeAlarm(Pointer bytesRecv, int numBytes, XCrypto key, XAlarm decodedAlarm); 

어떻게이 JNA 기능이 기대 포인터로 들어오는

int = Socket.getInputStream() 

"원시 데이터"를받을 수 있나요? 다른 어떤 숙제를 알고 있어야합니까? 엔디안, 부호없는 바이트 문제 등?

나는 그다지 진행되지 않을 수도 있지만, 내가 얻을 수있는 도움에 감사드립니다.

답변

0

SocketChannel을 사용하여 JNI에서 참조 할 수있는 직접 NIO 버퍼를 읽습니다. 같은 뭔가 :

SocketChannel client = SocketChannel.open(address); 
ByteBuffer buffer = ByteBuffer.allocate(42); 
client.read(buffer); 

그리고 매개 변수 대신 PointerBuffer하여 함수를 호출.