【问题标题】:Returning windows.h HANDLE to Java JNI将 windows.h 句柄返回给 Java JNI
【发布时间】:2018-05-07 13:01:58
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    看看HANDLE的定义:

    typedef void * HANDLE;
    

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

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

    【讨论】:

    • DCB 是一个结构体 没错,但是HANDLE 是一个void *,所以不可能取消引用它。您可以通过强制转换将其强制为指向特定结构的指针,但这会将代码与结构的特定版本联系起来——这可能是为了跨操作系统版本的可移植性而故意隐藏的,因此内部更改不需要重新编译代码.将HANDLE 值作为jlong 传递可能会更安全。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多