2012-10-16 34 views
1

在Windows上,我有一些通過Java Socket進入的第三方TCP數據,並且我試圖弄清楚如何將數據傳遞到由同樣的第三方 - 使用JNA。我對JNA/JNI/C等所有東西都很陌生。將套接字數據傳遞給JNA函數並使用void *參數

第三方庫將從套接字接收傳入字節並將它們解碼爲正確的消息類型。由於輸入的數據長度是任意的,沒有結尾分隔符,並且起始分隔符非常短(因此可能出現在數據的中間並且不是實際的分隔符),但實際上可能更容易弄清楚如何使用這個圖書館雖然JNA而不是滾動我自己的(或學習C)。

我設法使用jnaerator從C頭文件生成源代碼。我也成功地調用了一個不需要參數的簡單C函數。但是,當試圖使用需要將「原始數據」傳遞給最初接受空指針的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); 

我如何獲得進入

int = Socket.getInputStream() 

「原始數據」 到了JNA函數需要一個指針?我還需要注意哪些其他問題?字節順序,無符號字節問題等?

我知道這可能不會太多,但我很感激我能得到的任何幫助。

回答

0

使用SocketChannel來讀取直接NIO緩衝區,我們可以從JNI中解除引用。喜歡的東西:

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

並調用與Buffer的功能參數,而不是Pointer