我想在将指向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)指向Point2 sctruct:
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代码。我尝试了许多替代方案但没有成功。
拜托,我对此表示感谢。
谢谢,
费尔南多。
修改
我修改了代码,但它部分工作。
//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.**
}
}
答案 0 :(得分:0)
jna docs说构造函数Structure(Pointer)将结构分配到预分配的内存中。它不会自动为你分配值。我不认为那是你想要的。
将构造函数更改为
public Point2(){
super();
}
public Point2(Point1 p){
super();
pt1.x = p.x;
pt1.y = p.y;
this.x = something;
this.y = something;
}
答案 1 :(得分:0)
在回调的上下文中,JNA将自动调用条目上的Structure.read和退出时的Structure.write,以获取Structure类型的任何参数。
如果声明回调方法签名使用相应子类的Structure类型(在示例中为“Point2”),则应该自动复制到本机内存或从本机内存复制。