我正在尝试使用 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/