首页 > 解决方案 > 将 windows.h 句柄返回给 Java JNI

问题描述

我有一个用 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 对象中处理它

标签: javacwindowsserial-portjava-native-interface

解决方案


看一下HANDLE的定义:

typedef void * HANDLE;

由于 void 指针不是一些复杂的内存结构,它可以在 Java 中声明为long. 对于 32 位架构int来说就足够了,但是如果你只使用long32 位和 64 位就适合了。

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


推荐阅读