Как отобразить void * в java - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь отобразить следующий метод C, предоставленный из vxlapi.dll, в java:

XLstatus xlCanTransmit (
XLportHandle portHandle,
Xlaccess accessMask,
unsigned int *messageCount,
void *pMessages)

Моя проблема связана с void * pmessages , я пытался использоватьУказатель, как указано на странице сопоставления JNA, но 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.Можете ли вы помочь мне понять, в чем я не прав?Спасибо

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Я обнаружил, что структуры расположены неправильно, и в нем отсутствовал статический тип.Я переписал структуру правильно, но теперь у меня есть проблема, что внутри s_xl_event заполнены все поля, кроме s_xl_tag_data.Я не знаю, зависит ли это от того факта, что это объединение других структур ...

0 голосов
/ 08 мая 2019

Я создал метод с именем 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 вызывает функцию, определенную в интерфейсе, расширяющем библиотеку:

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.Мне нужно было выделить память, потому что при получении назначенное количество (24) было недостаточным и вызывало сбой JVM.

...