JNA:无法创建结构子类的对象 - 无效的结构字段
JNA: Can't create object of structure subclass - Invalid structure field
我正在将 C typedef 映射到 JNA 结构。下面如果 C typedef:
typedef struct _GLYCOUNTERS {
unsigned int ulArraySize;
LPGLYCOUNTER lpCounters;
}GLYCOUNTERS, *LPGLYCOUNTERS;
这是我的 JNA 结构子class:
public class GlyCounters extends Structure{
public class ByReference extends GlyCounters implements Structure.ByReference {};
public class ByValue extends GlyCounters implements Structure.ByValue {};
public int ulArraySize;
public GlyCounter lpCounters;
@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[] { "ulArraySize", "lpCounters"});
}
}
我正在尝试使用代码创建和对象 GlyCounters class:
lppCounters = glyTypes.new GlyCounters();
如您所见,我正在另一个 class 中创建对象,GlyCounters 是另一个 class.
的嵌套 class
这是我收到的错误消息:
Exception in thread "main" java.lang.IllegalArgumentException: Invalid Structure field in class btc_dll.GloryTypeDef$GlyCounters, field name 'lpCounters' (class btc_dll.GloryTypeDef$GlyCounter): Can't instantiate class btc_dll.GloryTypeDef$GlyCounter (java.lang.InstantiationException: btc_dll.GloryTypeDef$GlyCounter)
at com.sun.jna.Structure.validateField(Structure.java:1038)
at com.sun.jna.Structure.validateFields(Structure.java:1048)
at com.sun.jna.Structure.<init>(Structure.java:179)
at com.sun.jna.Structure.<init>(Structure.java:172)
at com.sun.jna.Structure.<init>(Structure.java:159)
at com.sun.jna.Structure.<init>(Structure.java:151)
at btc_dll.GloryTypeDef$GlyCounters.<init>(GloryTypeDef.java:298)
at btc_gui.Btc_gui.main(Btc_gui.java:54)
Java Result: 1
导致问题的字段是另一个 C typedef 结构的另一个 JNA 结构 class。谷歌搜索错误消息后,我尝试向这两个 classes 添加无参数构造函数,但错误仍然存在。
有没有人遇到过类似的问题?
如果您想要在结构中使用类型为 struct *
的字段,则需要使用带有接口 Structure.ByReference
.
标记的 Structure
已编辑
最常用的方法:
public class GlyCounter extends Structure {
public class ByReference extends GlyCounter implements Structure.ByReference {};
// More definition here...
}
public class GlyCounters extends Structure{
public int ulArraySize;
public GlyCounter.ByReference lpCounters;
public GlyCounters(Pointer p) {
super(p);
read();
}
@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[] { "ulArraySize", "lpCounters"});
}
}
// To obtain the full array (assuming they're allocated as a block)
GlyCounters gc = new GlyCounters(pointer);
GlyCounter[] counters = gc.lpCounters.toArray(gc.ulArraySize());
字段 lpCounters
现在是指针类型而不是内联(即共享封闭 struct
的内存)。
我正在将 C typedef 映射到 JNA 结构。下面如果 C typedef:
typedef struct _GLYCOUNTERS {
unsigned int ulArraySize;
LPGLYCOUNTER lpCounters;
}GLYCOUNTERS, *LPGLYCOUNTERS;
这是我的 JNA 结构子class:
public class GlyCounters extends Structure{
public class ByReference extends GlyCounters implements Structure.ByReference {};
public class ByValue extends GlyCounters implements Structure.ByValue {};
public int ulArraySize;
public GlyCounter lpCounters;
@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[] { "ulArraySize", "lpCounters"});
}
}
我正在尝试使用代码创建和对象 GlyCounters class:
lppCounters = glyTypes.new GlyCounters();
如您所见,我正在另一个 class 中创建对象,GlyCounters 是另一个 class.
的嵌套 class这是我收到的错误消息:
Exception in thread "main" java.lang.IllegalArgumentException: Invalid Structure field in class btc_dll.GloryTypeDef$GlyCounters, field name 'lpCounters' (class btc_dll.GloryTypeDef$GlyCounter): Can't instantiate class btc_dll.GloryTypeDef$GlyCounter (java.lang.InstantiationException: btc_dll.GloryTypeDef$GlyCounter)
at com.sun.jna.Structure.validateField(Structure.java:1038)
at com.sun.jna.Structure.validateFields(Structure.java:1048)
at com.sun.jna.Structure.<init>(Structure.java:179)
at com.sun.jna.Structure.<init>(Structure.java:172)
at com.sun.jna.Structure.<init>(Structure.java:159)
at com.sun.jna.Structure.<init>(Structure.java:151)
at btc_dll.GloryTypeDef$GlyCounters.<init>(GloryTypeDef.java:298)
at btc_gui.Btc_gui.main(Btc_gui.java:54)
Java Result: 1
导致问题的字段是另一个 C typedef 结构的另一个 JNA 结构 class。谷歌搜索错误消息后,我尝试向这两个 classes 添加无参数构造函数,但错误仍然存在。
有没有人遇到过类似的问题?
如果您想要在结构中使用类型为 struct *
的字段,则需要使用带有接口 Structure.ByReference
.
Structure
已编辑
最常用的方法:
public class GlyCounter extends Structure {
public class ByReference extends GlyCounter implements Structure.ByReference {};
// More definition here...
}
public class GlyCounters extends Structure{
public int ulArraySize;
public GlyCounter.ByReference lpCounters;
public GlyCounters(Pointer p) {
super(p);
read();
}
@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[] { "ulArraySize", "lpCounters"});
}
}
// To obtain the full array (assuming they're allocated as a block)
GlyCounters gc = new GlyCounters(pointer);
GlyCounter[] counters = gc.lpCounters.toArray(gc.ulArraySize());
字段 lpCounters
现在是指针类型而不是内联(即共享封闭 struct
的内存)。