用Java加载DLL - JNA

时间:2017-04-16 01:01:40

标签: java jna

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

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

1 个答案:

答案 0 :(得分: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值,例如,使用{{ 1}}。