我正在尝试将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崩溃。

10-05 21:21
查看更多