JNA 参考传递结构帮助
Posted
技术标签:
【中文标题】JNA 参考传递结构帮助【英文标题】:JNA Passing Structure By Reference Help 【发布时间】:2010-10-30 09:53:03 【问题描述】:我正在尝试使用 JNA 通过插入计算机的 USB 设备进行通话。使用 Java 和提供给我的 .dll。我在使用 Write 功能时遇到问题:
C 代码:
typedef struct
unsigned int id;
unsigned int timestamp;
unsigned char flags;
unsigned char len;
unsigned char data[16];
CANMsg;
CAN_STATUS canplus_Write(
CANHANDLE handle, //long
CANMsg *msg
);
Java 等价物:
public class CANMsg extends Structure
public int id = 0;
public int timestamp = 0;
public byte flags = 0;
public byte len = 8;
public byte data[] = new byte[16];
int canplus_Write(NativeLong handle, CANMsg msg);
我已确认我可以打开和关闭设备。关闭需要 NativeLong 句柄,所以我假设 CANMsg 消息是这里的问题。我还确认该设备在使用纯 C 代码进行测试时可以正常工作。
我已经彻底阅读了 JNA 文档……我想。任何指针。谢谢大家。
【问题讨论】:
【参考方案1】:我对 JNA 了解不多,但是当指针作为简单地址传输时,跨语言数据传输通常会失败。
如果它指向的数据是您要发送的数据,则可能在某处有一个打包方法调用。如果您不是自己编写的,可能它是由这个 JNA 框架生成的……将其添加到您的问题中可能很有用。
将 C 字符映射到 Java 字节对我来说也有点奇怪,但我可以看到它的来源。您在什么操作系统上运行此代码?
【讨论】:
所以,要补充一点的是,JNA 的文档非常好,其中包含大量示例。如何翻译结构:jna.dev.java.net/javadoc/overview-summary.html#structures 类型的翻译在页面上更进一步。所以既然他们能做到……为什么我不能!无论如何。感谢您的意见。【参考方案2】:len 是结构的大小吗?如是;那么你给出的值是错误的。这样做:
CANMsg msg = new CANMsg();
msg.len = msg.size();
【讨论】:
【参考方案3】:canplus_write 接口也有问题。到目前为止,一切都指向提供的驱动程序中的一个错误——我认为新的 USBCANPlus 模块还没有经过适当的测试阶段。从您的代码中,我可以看到您使用的是旧版本的驱动程序,因为数据字段应包含 8 个字节(这是 CAN 消息中的最大数据字节数)。我通过自己的调查发现,驱动程序无法将数据正确转换为 ASCII 字符,即如果您要发送 01 02 03,它将向模块发送 ASCII 字符 '1' '2' '3' '0' '1' '0' '2' '0' '3' - 您可以使用 USB 监控软件来验证这一点。我目前正在与 FTDI 技术支持联系,希望他们能尽快发布驱动程序的更新版本。
希望这也能解决您的问题,我也建议您与他们联系。
【讨论】:
【参考方案4】:我对您正在使用的 dll 一无所知,但 CANMsg.len 很可能指的是 byte[] 数据中实际有多少字节。因此,您要么需要跟踪写入 byte[16] 数据数组的数量,要么根据终止的 null char 计算 len(假设 String ASCII 是数据)。我不认为 CANMsg.size() 存在或像上面 Rusty 建议的那样实现。
【讨论】:
以上是关于JNA 参考传递结构帮助的主要内容,如果未能解决你的问题,请参考以下文章