[RESOLVIDO] Passagem de Array de Structure para uma dll (JNA)

1 resposta Resolvido
cjava
L

Boa tarde necessito passar passar um Array de structure segue códigos.

public class PW_GetData extends Structure {
        public static class ByReference extends PW_GetData implements 
                                                Structure.ByReference {}  
        public short wIdentificador = 0;
        public byte bTipoDeDado     = 0;
        public byte[] szPrompt      = new byte[84];
        public byte bNumOpcoesMenu  = 0;
        public byte[][] vszTextoMenu = new byte[20][41];
}

declaração da dll…

short PW_iExecTransac(PW_GetData[] pw_Data, IntByReference piNumParam);

passando parâmetro

IntByReference tam = new IntByReference(10);
PGWebLib.PW_GetData.ByReference[] pw_Data = new PGWebLib.PW_GetData.ByReference[10];
for (int i=0;i<10;i++){
    pw_Data[i] = new PGWebLib.PW_GetData.ByReference();
}
ret = INSTANCE.PW_iExecTransac(pw_Data, tam);

Erro:

Caused by: java.lang.IllegalArgumentException: Function PW_iExecTransac declared Structure[] at parameter 0 but array of class br.com.load.dll.meu.deus.loaddll.PGWebLib$PW_GetData$ByReference was passed

at com.sun.jna.Function.convertArgument(Function.java:580)

at com.sun.jna.Function.invoke(Function.java:305)

at com.sun.jna.Library$Handler.invoke(Library.java:236)

at com.sun.proxy.$Proxy5.PW_iExecTransac(Unknown Source)

at br.com.load.dll.meu.deus.loaddll.FXMLController.handleButtonAction(FXMLController.java:78)

 58 more

Alguém tem alguma ideia?

1 Resposta

L
Solucao aceita

Existia alguns erros primeiro o Structure tinha uma array multidimencional…

public byte[][] vszTextoMenu = new byte[20][41];

foi mudado para

public byte[] vszTextoMenu = new byte[20*41];

passando parâmetro

PGWebLib.PW_GetData pw_Data = new PGWebLib.PW_GetData();
PGWebLib.PW_GetData[] array = (PGWebLib.PW_GetData[])pw_Data.toArray(10); 
ret = INSTANCE.PW_iExecTransac(array , 10);

Um Grande obrigado ao Marcelo Senaga que com toda sua experiencia descobriu estes erros.

Criado 28 de outubro de 2016
Ultima resposta 28 de out. de 2016
Respostas 1
Participantes 1