Como fazer o cast de um pointer para uma estrutura usando JNA

0 respostas
F

Olá All,

Estou tendo problema em uma função de callback e gostaria de uma ajuda. Estou usando uma dll que tem uma função de callback e a defini em java, usando JNA, para o código abaixo:
public void callback(Pointer Params, int ParamSize, int cmd)
Params é um pointer para uma sctruct em C na dll, definida conforme abaixo:
typedef struct
{
   int x;
   int y;
}Point;
Point *gpt;

typedef struct
{
   int x;
   int y;
   Point pt1;
}Point2;
Point2 *gpt2;
Implementei em java as estruturas acima da seguinte forma:
public class Point extends Structure
{
   public static class ByValue extends Point implements Structure.ByValue {}
   public static class ByReference extends Point implements Structure.ByReference{}
   public int x;
   public int y;
   public Point(Pointer p){
	   super(p);
   }
   public Point(){
	   super();
   }
}
public class Point2 extends Structure {
	   public static class ByValue extends Point2 implements Structure.ByValue {}
	   public static class ByReference extends Point2 implements Structure.ByReference{}
	   public int x;
	   public int y;
	   Point pt1 = new Point();
	   public Point2(Pointer p){
		   super(p);
	   }
	   public Point2(){
		   super();
	   }
}
A função que implementa o callback em java é a seguinte:
public void callback(Pointer Params, int ParamSize, int cmd) {
		switch (cmd){
			case 1:
				Point2 pt2; // = new Point2();
				pt2 = new Point2(Params);
				pt2.read();
				System.out.println("pt2.x = "+pt2.x);              //Aqui o valor mostrado é 4 e está correto.
				System.out.println("pt2.y = "+pt2.y);              //Aqui o valor mostrado é 5 e está correto.
				System.out.println("pt2.pt1.x = "+pt2.pt1.x);  //Porém, aqui o valor é zero e deveria ser 6.
				System.out.println("pt2.pt1.y = "+pt2.pt1.y);  //Aqui o valor é zero e deveria ser 7.
				break;
			case 2:
				...qualquer código...
			default:
				...qualquer código...
		}
	}
Quando a função de callback é chamada ela recebe da dll um pointer (Params) para a estrutura nativa Point2, estou passando este pointer para o construtor de Point2 em java e fazendo o pt2.read() para atualizar o conteúdo da estrutura. O problema que está ocorrendo é que apenas pt2.x e pt2.y recebem os valores corretos, pt2.pt1.x e pt2.pt1.y estão zerados.

Não estou passando corretamente o pointer (Params) da estrutura em C para o construtor da Point2 em java. Da forma como fiz a estrutura Point2 é atualziada corretamente apenas para os campos x e y, a estrutura pt1 não é atualizada.

Já fiz algumas tentativas sem sucesso, inclusive passando o mesmo pointer para o construtor de Point, quando faço isto o valor mostrado para pt2.pt1.x e pt2.pt1.y é o mesmo que pt2.x e pt2.y.

Como faço para inicializar uma estrutura aninhada em java usando o pointer recebido ?

Agradeço se alguém puder dar uma ajuda.

Fernando.

Criado 17 de junho de 2011
Respostas 0
Participantes 1