java - 将 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 对象中处理它
解决方案
看一下HANDLE的定义:
typedef void * HANDLE;
由于 void 指针不是一些复杂的内存结构,它可以在 Java 中声明为long
. 对于 32 位架构int
来说就足够了,但是如果你只使用long
32 位和 64 位就适合了。
DCB是一种结构。要在 Java 中使用它,您可以传输一个字节数组,但您必须知道(即从头文件计算)每个结构成员的索引才能访问它。如果您为传输创建一个专用的 Java 对象并在 C 代码中复制结构值,则可能会更清楚。
推荐阅读
- python - 熊猫计算一列中值的出现次数
- macos - macOS Mojave – sane-backends “libusb not available” 编辑:设备未配置
- c# - 使用 Find in Awake 缓存脚本引用,在 Start 中不起作用
- android - 如何在 JsonArray 中存储多行?
- python - 无法使用 pip 安装 blist
- c# - 当我提取元素时,c# List 的数组是否被移动?
- java - Map<> 中 entrySet() 上的 add() 方法
- python - 如何在Python中计算给定语料库的复数和单数数量
- c++11 - 类内初始化器到底是什么?
- php - WooCommerce 自定义字段 PHP 7 工作 PHP 7.1 和 7.2 不工作