在 Windows 上,我有一些通过 Java 套接字传入的第 3 方 TCP 数据,我正在尝试弄清楚如何将数据传递到同一第 3 方提供的 C 库中 - 使用 JNA。我对 JNA/JNI/C 等所有东西都是新手。
第 3 方库将从套接字中获取传入字节并将它们解码为正确的消息类型。由于传入的数据是任意长度的,没有结束定界符,并且起始定界符非常短(因此可能出现在数据中间而不是实际的定界符),实际上可能更容易弄清楚如何使用它通过 JNA 库而不是自己滚动(或学习 C)。
我已经设法使用 jnaerator 从 C 头文件生成源代码。我还成功地调用了一个不需要参数的简单 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);
如何获取传入的
int = Socket.getInputStream()
将“原始数据”转换为 JNA 函数期望的指针?我还需要注意哪些其他问题?字节顺序、无符号字节问题等?
我知道这可能不会继续下去,但我很感激我能得到的任何帮助。
最佳答案
使用 SocketChannel读入一个直接的 NIO 缓冲区,我们可以从 JNI 中取消引用。像这样的东西:
SocketChannel client = SocketChannel.open(address);
ByteBuffer buffer = ByteBuffer.allocate(42);
client.read(buffer);
并使用 Buffer
而不是 Pointer
作为参数调用您的函数。
关于java - 使用 Void* 参数将套接字数据传递给 JNA 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12905903/