2017-04-16 97 views
1

我试图使用JNA API 我的DLL函数是:加载DLL - JNA

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

如果可能的话,使用JNI而不是JNA。 JNA是性能杀手。我认为java中的'byte'可以映射到'unsigned char' – 2017-04-16 01:19:33

+0

你确定你已经发布了正确的DLL函数签名吗?在网上简单搜索一下这个函数和参数后,会显示你没有包含的*符号,这些符号对于回答你的问题至关重要。 –

回答

1

通过在原始问题中突出显示加粗,帖子格式吞噬了您的帖子中的关键信息,所以我的原始答案不太正确。我试着编辑你的文章并恢复你的原意,并且适当地更新了我的答案。但是,根据我在简短搜索中发现的其他DLL中的函数名称的审阅,我不确定是否正确引用了源DLL,特别是Baud变量是否也是指针(*)。

您在第一站查看正确的映射应该是the JNA documentation

对于C指针类型,JNA Pointer可以工作,但需要您做更多的手动工作来分配内存,读取结果,然后从指针地址中选择正确的字节数来读取。当指定类型的指针时,就像在这种情况下一样,你应该使用合适的映射,它可以为你分配内存,并且更好地控制对方法的“强类型”访问。

对于你的unsigned char *ComAdr你想要使用ByteByReference映射。与int * FrmHandle类似,您可以使用IntByReference。您已将波特列为unsigned char类型,它将直接映射到byte;然而,其他的API也有char *,所以它将与ByteByReference映射相同。

请注意,Java不使用无符号变量,所以一旦从返回值中提取它们以确保它们对应于无符号C值,就必须对负字节值采取额外操作,例如使用& 0xff