我想帮助将一个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 回答
jna文档说构造函数Structure(Pointer)将结构分配到预分配的内存中 . 它不会自动为你分配值 . 我不认为这就是你想要的 .
将构造函数更改为
在回调的上下文中,JNA将自动调用条目上的Structure.read和退出时的Structure.write,以获取Structure类型的任何参数 .
如果声明回调方法签名使用相应子类的Structure类型(在示例中为“Point2”),则应该自动复制到本机内存或从本机内存复制 .