我正在尝试使用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);
我必须在界面中使用哪种类型? 对象“指针”是对的吗?
答案 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}}。