首页 文章

如何将指向c结构的指针强制转换为jna结构

提问于
浏览
2

我想帮助将一个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中的回调函数,带有指向Point2 sctruct的指针(void * params):

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

    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;
    }
    
  • 0

    在回调的上下文中,JNA将自动调用条目上的Structure.read和退出时的Structure.write,以获取Structure类型的任何参数 .

    如果声明回调方法签名使用相应子类的Structure类型(在示例中为“Point2”),则应该自动复制到本机内存或从本机内存复制 .

相关问题