在Windows上,我有一些第三方TCP数据通过Java Socket进入,我正在试图弄清楚如何将数据传递到同一第三方提供的C库 - 使用JNA。我是JNA / JNI / C等所有新手。
第三方库将从套接字中获取传入的字节,并将它们解码为正确的消息类型。由于进入的数据是任意长度的,没有结束分隔符,并且起始分隔符非常短(因此可能出现在数据的中间而不是实际的分隔符)实际上可能更容易弄清楚如何使用它库通过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 :(得分:0)
使用SocketChannel读取直接NIO缓冲区,我们可以从JNI中取消引用。类似的东西:
SocketChannel client = SocketChannel.open(address);
ByteBuffer buffer = ByteBuffer.allocate(42);
client.read(buffer);
使用Buffer
作为参数调用您的函数,而不是Pointer
。