【问题标题】:Passing Native Function a reference variable in Java JNA在 Java JNA 中向 Native Function 传递一个引用变量
【发布时间】:2014-06-29 23:12:27
【问题描述】:

我正在尝试编写一个 Java 小程序来连接到条形码扫描仪并读取数据。条形码扫描仪带有一个 dll 文件,该文件具有访问它的功能。我对 Java 没有太多经验,但我已经知道如何使用 JNA 加载 dll 并调用本机函数。一些功能工作正常,但返回实际条形码的功能我似乎无法开始工作。它需要一个字符数组作为参数,并且通过引用传递不在 JNA 中,我尝试使用 Pointer 类并且无法使任何工作。原生函数定义如下。

NoMangle long DLL_IMPORT_EXPORT csp2GetPacket (char szBarData[],long nBarcodeNumber,long nMaxLength)

函数调用后 szBarData[] 变量应该包含条形码数据。

我尝试了几种不同的方式设置 JNA 映射,将 szBarData[] 参数设置为 char 数组、字符串、字节数组和指针,但都没有成功。

在 Visual Basic 中,您可以向 szBarData[] 传递一个字符串,它可以工作,只是不确定如何使用 JNA 在 Java 中完成此操作。

【问题讨论】:

  • 尝试在java中传递一个“char[]”。

标签: java jna


【解决方案1】:

由于您希望目标函数填充缓冲区,因此您不能传递String(只读),而必须传递byte[]

还要确保你没有使用 Java long 来代表原生 longNativeLong 类就是为此目的而存在的。

如果您返回的是一个以 NUL 结尾的 C 字符串,那么您可以使用 Native.toString(byte[]) 转换为 String

【讨论】:

  • 这有效,我尝试使用基于我看到的另一个论坛的 byte[],但我不断收到随机返回的内容。我尝试使用几个不同的 toString() 函数,但结果相同,我从未在任何其他论坛或文档中遇到过 Native.toString() ,但它工作得很好。非常感谢!!
  • 欢迎贡献文档补丁!
猜你喜欢
  • 1970-01-01
  • 2010-10-04
  • 2019-11-21
  • 2011-08-30
  • 1970-01-01
  • 2021-06-29
  • 2017-01-27
  • 2012-07-19
  • 2016-11-24
相关资源
最近更新 更多