1

在 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 函数期望的指针?我还需要注意哪些其他问题?字节序、无符号字节问题等?

我知道这可能没什么可做的,但我很感激我能得到的任何帮助。

4

1 回答 1

0

使用SocketChannel读取直接 NIO 缓冲区,我们可以从 JNI 中取消引用。就像是:

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

并使用Bufferas 参数而不是Pointer.

于 2012-10-16T09:13:27.253 回答