【发布时间】:2011-09-15 16:41:41
【问题描述】:
在将指向 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.**
}
}
我制作了一个 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.**
}
}
【问题讨论】:
标签: pointers casting callback structure jna