我正在尝试将vxlapi.dll提供的以下C方法映射到java:
XLstatus xlCanTransmit (
XLportHandle portHandle,
Xlaccess accessMask,
unsigned int *messageCount,
void *pMessages)
我的问题与void * pmessages有关,我尝试按照JNA映射页中的指示使用Pointer,但dll似乎不接受该类型。
我需要传递s_xl_event消息,它是一个如此定义的结构:
public class s_xl_event extends Structure {
public class ByReference extends s_xl_event implements Structure.ByReference {}
public byte tag;
public byte chanIndex;
public short transId;
public short portHandle;
public byte flags;
public byte reserved;
public long timeStamp;
public s_xl_tag_data tagData;
public s_xl_event() {
allocateMemory(56); // vxlapi.h: s_xl_event requires 48 byte
}
@Override
protected List<String> getFieldOrder() {
return Arrays.asList("tag","chanIndex","transId","portHandle","flags","reserved","timeStamp","tagData");
}
}
如果我传递了s_xl_event项目,则dll响应正常,但未按预期运行,将所有值发送为0。使用指针返回XL_ERR_WRONG_PARAMETER。
您能帮我了解我的错吗?谢谢
最佳答案
我创建了一个名为send的方法,其中执行以下步骤:
IntByReference pEventCount = new IntByReference(1);
s_xl_event eventMsg = new s_xl_event();
eventMsg.tag = 10; // XL_TRANSMIT_MSG
eventMsg.tagData.msg.id = Long.parseLong(message.getID());
eventMsg.tagData.msg.dlc = (short) message.getSize();
eventMsg.tagData.msg.flags = (short) 0;
try {
eventMsg.tagData.msg.data = Hex.decodeHex(message.getDefaultPayload());
} catch(Exception e) {}
eventMsg.write();
short status = driver.canTransmit(portHandle, accessMask, pEventCount, eventMsg.getPointer());
canTrasmit方法调用扩展Library的接口中定义的函数:
public short canTransmit(long portHandle, long accessMask, IntByReference messageCount, Pointer message) {
short status = device.xlCanTransmit(portHandle, accessMask, messageCount, message);
return status;
}
public interface VectorInterface extends Library {
short xlCanTransmit(long portHandle, long accessMask, IntByReference messageCount, Pointer message);
}
我猜想API中已经指出了Structure。我需要分配内存,因为在接收中分配的数量(24)不足,并且会导致JVM崩溃。