java - 将 windows.h HANDLE 返回到 Java JNI

标签 java c windows serial-port java-native-interface

我有一个用 C 语言创建串行端口连接的方法,我们使用窗口句柄类型,例如,

hCom = CreateFile( portNo,
                GENERIC_READ | GENERIC_WRITE,
                0,    // must be opened with exclusive-access
                NULL, // no security attributes
                OPEN_EXISTING, // must use OPEN_EXISTING
                0,    // not overlapped I/O
                NULL  // hTemplate must be NULL for comm devices
                );

因此,我在特定端口号上创建连接。现在我想将此 HANDLE 类型返回到我的 JNI .h 程序。这样下次我就可以使用 HANDLE 类型进行操作,例如
通过对象发送/接收,该对象将封装此 HANDLE。

但是我无法编写此 HANDLE 类型的 JNI 等效项以及如何将其保存到 Java 对象。有人可以帮忙吗?
另外,如果可能的话,我们可以进一步从同一个 Windows.h 文件中抛出 DCB 类型并在 JNI 对象中处理它

最佳答案

看看HANDLE的定义:

typedef void * HANDLE;

由于 void 指针不是某种复杂的内存结构,因此可以在 Java 中将其声明为 long。对于 32 位架构,int 就足够了,但如果您只使用 long 32 位和 64 位就足够了。

DCB是一个结构体。要在 Java 中使用它,您可以传输字节数组,但您必须知道(即从头文件中计算)每个结构成员的索引才能访问它。如果您为传输创建专用 Java 对象并复制 C 代码中的结构值,可能会更清楚。

关于java - 将 windows.h HANDLE 返回到 Java JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50214896/

相关文章:

c - 我怎么知道统计失败的原因?

c - C 和 C++ 的最佳调试工具

java - 使用 Bundle 发送一些值

java - 如何使用 spring boot 和 jpa 在数据库中上传和保存文件?

c - 找到组件

windows - 使用 WiX 安装时启动外部服务

c# - 如何在网络浏览器控件内重新加载网页?

c++ - IWebbrowser2:使用 Uint8array(不循环填充)

java - 使用 Java 和 LDAP 将用户添加到 AD LDS (ADAM)

java - 将 ImageOutputStream 转换为 byte[]