Erro ao criar Structure usando JNA

6 respostas
eliangela

Olá pessoal!

Eu tenho a seguinte declaração em C++:

typedef struct {
    int TabSock[1024];
    DWORD TabIP[1024];
    int NumSockConec;
} TTABSOCK;
typedef TTABSOCK *PTABSOCK;

E uma função que retorna esse tipo de dado pra mim:

TTABSOCK __stdcall mt_connectlist(void);

A função acima está dentro de uma DLL.
Eu estou tentando criar essa STRUCT no Java usando JNA, mas não estou conseguindo. O meu programa dá um erro e fecha quando tento executar essa função nativa.

Segue abaixo a minha implementação para a Struct em Java/JNA:
public class TTABSOCK extends Structure {

	public int[] TabSock = new int[1024];
	public DWORD[] TabIP = new DWORD[1024];
	public int NumSockConec;
}

O que eu estou fazendo de errado?

Obrigada

6 Respostas

J

posta o erro para eu olhar.

eliangela

Olá Julio!!

O erro que dá é o seguinte:
Como estou usando o Windows 7, aparece uma janela com a mensagem:

Java(TM) Platform SE binary parou de funcionar
O Windows pode verificar online se há uma solução para o problema.

Quando eu clico em Detalhes do problema, aparece esse texto:
Assinatura do problema:
  Nome do Evento de Problema:	APPCRASH
  Nome do Aplicativo:	java.exe
  Versão do Aplicativo:	6.0.240.7
  Carimbo de Data/Hora do Aplicativo:	4d4a0b93
  Nome do Módulo de Falhas:	jna1303014036612106905.dll
  Versão do Módulo de Falhas:	3.3.0.0
  Carimbo de Data/Hora do Módulo de Falhas:	4de27ca1
  Código de Exceção:	c0000005
  Deslocamento de Exceção:	0000cbf0
  Versão do sistema operacional:	6.1.7600.2.0.0.256.48
  Identificação da Localidade:	1046
  Informações Adicionais 1:	83a7
  Informações Adicionais 2:	83a7065470e0ad2f8fca95b38d3a8603
  Informações Adicionais 3:	f323
  Informações Adicionais 4:	f323784c4d996b8ccf4aa4ee3b0b06ce

Leia nossa declaração de privacidade online:
  http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0416

Se a declaração de privacidade online não estiver disponível, leia nossa declaração de privacidade offline:
  C:\Windows\system32\pt-BR\erofflps.txt
Não sei se ajuda no meu problema, mas eu tenho aqui um exemplo em Delphi:
//Declaração do tipo
type TTABSOCK = packed record
    TSOCK: array [0..255] of DWORD;
end;

//Declaração da função
function myfunction: TTABSOCK; far; stdcall; external 'minhaDll.dll';

Já tentei fazer parecido com isso no Java e tbem não funcionou.

Obrigada

J

Eliangela, um DWORD dependendo da arquitetura do sistema possui 32 bits não sinalizados ou 64(em arquiteturas amd64). Então você pode mapea-lo com um int(32) ou long(64) em java.

O DWORD abaixo deve estar fazendo a máquina virtual quebrar.

public class TTABSOCK extends Structure {  
  
    public int[] TabSock = new int[1024];  
    public DWORD[] TabIP = new DWORD[1024];  
    public int NumSockConec;  
}

Se a máquina for de 64 bits você precisa de um long(que possui 64 bits)
Você pode mapear dword como int ou long sem problemas. Mas qual depende da arquitetura.

eliangela

Olá, Julio!

Tentei com long, int e DWORD e mesmo assim não funcionou.. :(

Este aqui é o texto da documentação da DLL:


TTABSOCK __stdcall mt_connectlist(void);

typedef struct
{
DWORD ip[255];
} TTABSOCK;
TTABSOCK.ip[0]=0x00000000
TTABSOCK.tab[1]=0xB600A8C0
TTABSOCK.tab[2]=0x00000000

Indica que no ID "1", existe um terminal conectado com o IP "B600A8C0" (192.168.0.182).

e o código que eu acabei de fazer:
public static class TTABSOCK extends Structure {

	public long[] ip = new long[255];
}

Sinceramente, não era pra estar dando errado.

J

a vm aí é 64 bits?

eliangela

não.

32 bits
Java 6.24

Criado 8 de novembro de 2011
Ultima resposta 9 de nov. de 2011
Respostas 6
Participantes 2