在 Java 中加载 DLL - JNA
Posted
技术标签:
【中文标题】在 Java 中加载 DLL - JNA【英文标题】:Loading DLL in Java - JNA 【发布时间】:2017-04-16 01:01:39 【问题描述】:我正在尝试使用 JNA api 我的 DLL 函数是:
Int OpenComPort(int Port, unsigned char *ComAdr, unsigned char Baud, int* FrmHandle);
我的java接口定义是:
public int OpenComPort(int p, Pointer ComAdr, Pointer Baud, Pointer FrmHandle);
我必须在我的界面中使用哪种类型? 对象“指针”对吗?
【问题讨论】:
如果可能,请使用 JNI 而不是 JNA。 JNA 是性能杀手。我认为java中的byte
可以映射到unsigned char
您确定您发布了正确的 DLL 函数签名吗?在线对该函数和参数的简短搜索会显示您未包含的 *
符号,这些符号对于回答您的问题至关重要。
【参考方案1】:
通过在原始问题中使用粗体突出显示,帖子格式吞噬了您帖子中的关键信息,因此我的原始答案不太正确。我已尝试编辑您的帖子并恢复您的原始意图,并已适当更新了我的答案。但是,根据我在简短搜索中找到的其他 DLL 中的函数名称的审查,我不确定您是否正确引用了源 DLL,尤其是 Baud
变量是否也是一个指针 (*)。
检查正确映射的第一站应该是the JNA documentation。
对于 C 指针类型,JNA Pointer
有效,但需要您执行更多手动工作来分配内存、读取结果,然后选择要从指针地址读取的正确字节数。当指定指针的类型时,在这种情况下,您应该使用适当的ByReference
映射,它为您完成内存分配工作并更好地控制对方法的“强类型”访问。
对于您的unsigned char *ComAdr
,您需要使用ByteByReference
映射。同样对于int * FrmHandle
,您将使用IntByReference
。您已将 Baud 列为简单的 unsigned char
类型,该类型将直接映射到 byte
;但是,其他 API 也将其作为 char *
,因此它是相同的 ByteByReference
映射。
请注意,Java 不使用无符号变量,因此从返回值中提取负字节值后,您必须对负字节值采取额外操作,以确保它们对应于无符号 C 值,例如,使用 @987654333 @。
【讨论】:
以上是关于在 Java 中加载 DLL - JNA的主要内容,如果未能解决你的问题,请参考以下文章