java - 在 Java 中加载 DLL - JNA

标签 java jna

我正在尝试使用 JNA api 我的DLL函数是:

Int OpenComPort(int Port, unsigned char *ComAdr, unsigned char Baud, int* FrmHandle);

我的java接口(interface)定义是:

public int OpenComPort(int p, Pointer ComAdr, Pointer Baud, Pointer FrmHandle);

我必须在界面中使用哪种类型? 对象“指针”正确吗?

最佳答案

通过在原始问题中使用粗体突出显示,帖子格式吞噬了帖子中的关键信息,因此我原来的答案不太正确。我已尝试编辑您的帖子并恢复您的初衷,并适当更新了我的答案。然而,根据我在简短搜索中找到的其他 DLL 中的函数名称,我不确定您是否正确引用了源 DLL,特别是 Baud 变量是否也是一个指针( *)。

检查正确映射的第一站应该是 the JNA documentation .

对于 C 指针类型,JNA Pointer 可以工作,但需要您执行更多手动工作来分配内存、读取结果,然后选择要从指针读取的正确字节数地址。当指定指针类型时,就像在本例中一样,您应该使用适当的 ByReference 映射,它可以为您完成内存分配工作,并更好地控制对方法的“强类型”访问。

对于您的unsigned char *ComAdr,您需要使用ByteByReference 映射。类似地,对于int * FrmHandle,您将使用IntByReference。您已将波特率列为简单的 unsigned char 类型,它将直接映射到 byte;但是,其他 API 也将其视为 char *,因此它将是相同的 ByteByReference 映射。

请注意,Java 不使用无符号变量,因此从返回值中提取负字节值后,您必须对负字节值采取额外操作,以确保它们对应于无符号 C 值,例如,使用 & 0xff.

关于java - 在 Java 中加载 DLL - JNA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43432700/

相关文章:

java - 尝试从列表构造 HashSet<Integer> 时参数不匹配 - 为什么?

java - Java 中的二进制到字符串转换?

java - 通过 JNA 使用 CFBooleanRef

clojure - 在 Clojure 中扩展(而不是实现)Java 接口(interface)

java - 调用 Zebra 打印机 API 时出现访问冲突

java - 初始化数据库连接对象一次并重用它 - jboss

java - 无法识别的 VM 选项 'AggressiveOpts'

java - 从应用程序自动发送电子邮件

使用 Mongo CSFLE (mongodb-crypt) 时/tmp 安装为 noexec 时出现 java.lang.UnsatisfiedLinkError

java - 是由 jvm 限制的 C 代码在 JNA(或 JNI)中分配的内存(参数 -Xmx 或架构 32/64)