gpt4 book ai didi

java - 如何在 Java 中获取 typedef void* 值?

转载 作者:行者123 更新时间:2023-12-05 05:49:07 26 4
gpt4 key购买 nike

我有一个用 C 编写的 dll。我必须在 Java 中实现将使用此 dll 的代码,但我不太明白给定的 h 文件的含义。

 typedef void* wqctl_handle;

wqctl_handle _stdcall wqctl_connect (const char* SettFile, const char* SettSec, const char* name, const char* pwd);

什么是适用于 Java 的 wqctl_handle 返回类型以及如何正确使用它? (我明白我应该使用JNA,但我的经验不足以理解这一点)

我设法实现了这样的东西:

 public interface Qmonitor extends StdCallLibrary {

Qmonitor INSTANCE = (Qmonitor) Native.load(new File("").getAbsolutePath() + "\\ClientAPI.dll", Qmonitor.class);

int wqctl_connect(String settFile, String settSec, String name, String pwd);
}

根据文档,此方法应返回连接描述符或 0。但我收到错误消息:

java.lang.Error: Invalid memory access
at com.sun.jna.Native.invokeInt(Native Method)

最佳答案

JNA Mappings文档指出 void * 映射到 JNA 中的 Pointer。指针大小取决于操作系统的位数,在 32 位系统上为 32 位,在 64 位系统上为 64 位。

通过包含 int 的返回类型,您需要返回值适合 32 位。但是,您在 64 位操作系统上执行并在 JNA 尝试将 8 字节存储到 4 字节内存分配时收到错误。

虽然 Pointer 类本身将用作返回值并且是低级通用指针,但通常的做法是将 PointerType 类用于类型 -安全指针。在这种情况下你可以这样写:

class WqctlHandle extends PointerType {}

然后您可以根据需要将该类型安全的 WqctlHandle 指针传递给其他方法。您还可以在该类中添加代码以使用该指针作为参数来实现函数,例如在调用 Qmonitor.INSTANCE.doFoo(wcqtl_handle ptr);

的类中包含一个 doFoo() 方法

关于java - 如何在 Java 中获取 typedef void* 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70702471/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com