java - 使用 Void* 参数将套接字数据传递给 JNA 函数

标签 java c jna jnaerator

在 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/

相关文章:

java - java 类文件的次要版本

当我尝试入队时出现 C 段错误

c++ - 使用 memcpy 将结构转换为 char 数组

java - 是否可以注释导出的函数名称?

java - 写入 stderr 时,共享 C 库 (JNI) 在 jetty 下挂起

java - 初始化设置的内容 View 后可以更改Android Button的样式吗?

java - 使用 Java (POST) 提交表单

java - 奇怪现象: Java/Swing-operations cause access violation in native library (JNA)

java - 如何获取示例 : 2016-08-29T09:15:17Z? 的时间戳

C 数据类型创建