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

Pointers 如何将指向c结构的指针强制转换为jna结构,pointers,casting,callback,structure,jna,Pointers,Casting,Callback,Structure,Jna,我想要一些帮助,将指向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结

我想要一些帮助,将指向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结构的指针(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.**
    }   
   }
//UsePointLib.java
公共接口ifuncallback扩展了StdCallCallback{
无效回调(指针参数、int参数大小);
}
公共类FuncCallback实现IFuncCallback{
@凌驾
公共void回调(指针参数,int-ParamSize){
点2 pt2;/=新点2();
pt2=新的点2(参数);

System.out.println(“pt2.x=“+pt2.x”);***jna文档说构造函数结构(指针)将结构分配到预先分配的内存上。它不会自动为您分配值。我认为这不是您想要的

将构造函数更改为

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

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

jna文档说构造函数结构(指针)将结构分配到预先分配的内存上。它不会自动为您分配值。我认为这不是您想要的

将构造函数更改为

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

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

在回调的上下文中,JNA将自动调用Structure.read-on-entry和Structure.write-on-exit作为Structure类型的任何参数


如果声明回调方法签名以使用适当子类的结构类型(在示例中为“Point2”),则向本机内存/从本机内存复制应该是自动的。

在回调上下文中,JNA将自动调用Structure.read-on-entry和Structure.write-on-exit以获取Structure类型的任何参数


若您声明回调方法签名以使用适当子类的结构类型(“示例中的点2”),复制到本机内存/从本机内存复制应该是自动的。

你好,谢谢你的帮助。我读过jna文档,我知道,但是,我想做的是将数据从dll中的结构复制到java内存。这是一个CTI应用程序,dll由CTI卡供应商提供,回调是接收来自卡的事件(铃声、接听电话等).因此,我将回调放在一个线程中,并使用消费者/生产者将事件数据通过队列传递给另一个线程。这是因为我需要将接收到的指针指向的内容复制到本地内存。我将编辑我的帖子以放置一个可能的解决方案。嗨,Abhijith,谢谢你的帮助。我阅读了jna文档,我知道,but,我想做的是将数据从dll中的结构复制到java内存中。这是一个CTI应用程序,dll由CTI卡供应商提供,回调是接收来自卡的事件(铃声、呼叫应答等)。因此,我将回调放在一个线程中,并使用消费者/生产者将事件数据通过队列传递给另一个线程。这是因为我需要将接收到的指针指向的内容复制到本地内存。我将编辑我的帖子以放置一个可能的解决方案。Hi-Technomage,我不能子类化,因为回调指向更多的线程基于以前的条件,不止一个c结构。例如,在一个调用中,params指向struct PointX,在另一个调用中,它指向struct PointY,这与PointX完全不同。经过一些尝试后,我使用structure构造函数传递收到的指针来解决问题。在构造函数中,我使用了useMemory(指针p)映射本机内存。这是可能的,因为我知道每次调用中指向的c结构,所以我可以使用正确的java结构覆盖其构造函数。谢谢。如果使用3.3.0或更高版本,请使用结构(指针)构造函数,而不是使用内存(指针);后者将多余地分配内存。Hi Technomage,我不能子类化,因为回调基于以前的条件指向多个c结构。例如,在一个调用中,params指向struct PointX,在另一个调用中,它指向struct PointY,这与PointX完全不同。经过一些尝试,我解决了我们的问题正在调用传递接收到的指针的结构构造函数。在构造函数中,我使用useMemory(指针p)映射本机内存。这是可能的,因为我知道每次调用中指向的c结构,所以我可以使用正确的java结构重写其构造函数。谢谢。如果使用3.3.0或更高版本,请使用结构(指针)ctor而不是USEMORY(指针);后者将多余地分配内存。