Pointers 如何将指向c结构的指针强制转换为jna结构
我想要一些帮助,将指向C结构的指针转换为jna结构。我使用jna从dll接收回调函数,该函数有一个指向C结构的指针参数,当我试图将指针转换为jna结构时,我得到了错误的结构值 这就是C结构: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结
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(指针);后者将多余地分配内存。