Как привести указатель на структуру c к структуре jna - PullRequest
2 голосов
/ 15 июня 2011

Мне нужна помощь в приведении указателя на структуру C на структуру jna. Я использую jna для получения функции обратного вызова от dll, функция имеет параметр, который является указателем на структуру C, когда я пытаюсь привести указатель к структуре jna, я получаю неправильные значения структуры.

Это структура C:

typedef struct
{
   int x;
   int y;
}Point;
Point *gpt;

typedef struct
{
   int x;
   int y;
   Point pt1;
}Point2;
Point2 *gpt2;

Это функция обратного вызова в C с указателем (void * params) на sctruct Point2:

void __stdcall PointCallback(void *params, int param_size)

Итак, я сделал этот код в Java, чтобы получить обратный вызов и получить оригинальную структуру:

// Point.java    
package Callback.UsePointLib;
import com.sun.jna.Structure;

public class Point extends Structure
{
   public static class ByValue extends Point implements Structure.ByValue {}
   public int x;
   public int y;
}

//Point2.java
package Callback.UsePointLib;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;

public class Point2 extends Structure {
       public int x;
       public int y;
       Point pt1;
       public Point2(Pointer p){
           super(p);
       }
}

Реализация обратного вызова:

//UsePointLib.java
public interface IFuncCallback extends StdCallCallback{
       void callback(Pointer Params, int ParamSize);
   }
   public class FuncCallback implements IFuncCallback{
    @Override
    public void callback(Pointer Params, int ParamSize) {
        Point2 pt2; // = new Point2();
        pt2 = new Point2(Params);
        System.out.println("pt2.x = "+pt2.x);        **<- I get zero here instead of four**
        System.out.println("pt2.y = "+pt2.y);        **<- I get zero here instead of five**
        System.out.println("pt2.pt1.x = "+pt2.pt1.x);**<- pt1 is null, throwing exception**
        System.out.println("pt2.pt1.y = "+pt2.pt1.y);**<- same as pt1.**
    }   
   }

Я создал C-программу для доступа к dll и получения обратного вызова, и она работает нормально, она получает правильные значения. Итак, проблема в моем Java-коде. Я перепробовал много альтернатив, но безуспешно.

Пожалуйста, я был бы признателен за любую помощь в этом.

Спасибо

Фернандо.


EDIT

Я изменил код, и он работает частично.

 //UsePointLib.java
    public interface IFuncCallback extends StdCallCallback{
           void callback(Pointer Params, int ParamSize);
       }
       public class FuncCallback implements IFuncCallback{
        @Override
        public void callback(Pointer Params, int ParamSize) {
            Point2 pt2; // = new Point2();
            pt2 = new Point2(Params);
                *pt2.read();*   **<--Modification**
            System.out.println("pt2.x = "+pt2.x);        **<- I get the correct value (four)**
            System.out.println("pt2.y = "+pt2.y);        **<- I get the correct value (five)**
            System.out.println("pt2.pt1.x = "+pt2.pt1.x);**<- pt1 is still null, throwing exception**
            System.out.println("pt2.pt1.y = "+pt2.pt1.y);**<- same as pt1.**
        }   
       }

Ответы [ 2 ]

0 голосов
/ 01 июля 2011

В контексте обратного вызова JNA автоматически вызывает Structure.read при входе и Structure.write при выходе для любых параметров типа Structure.

Если вы объявляете свою сигнатуру метода обратного вызова для использования типа структуры соответствующего подкласса («Point2» в вашем примере), копирование в / из собственной памяти должно выполняться автоматически.

0 голосов
/ 16 июня 2011

Документы jna говорят, что конструктор Structure (Pointer) выделяет структуру в предварительно выделенную память.Он не будет автоматически присваивать вам значения. Я не думаю, что это то, что вы хотите.

Измените конструкторы на

public Point2(){
    super();
}
public Point2(Point1 p){
    super();
    pt1.x = p.x;
    pt1.y = p.y;

    this.x = something;
    this.y = something;
}
...