在 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的主要内容,如果未能解决你的问题,请参考以下文章

java 加载dll介绍(转)

无法在 python 中加载 c++ DLL

在同一个进程中加载​​同一个 DLL 的 2 个版本

在VS2010中加载dll文件时的第一次机会异常

java使用jna加载dll文件可以运行成功,打包后运行jar文件却找不到dll文件

sqljdbc_auth.dll 已在另一个类加载器中加载