JNA 错误的结构字段值
JNA wrong structure field values
我正在围绕 JNA 适配器跳舞 "twain.h" - 几乎做到了,但在获取扫描器功能方面仍然存在一些问题。
有一个原始实体:
typedef unsigned short TW_UINT16, FAR *pTW_UINT16;
typedef unsigned long TW_UINT32, FAR *pTW_UINT32;
typedef struct {
TW_UINT16 ItemType;
TW_UINT32 MinValue; /* Starting value in the range. */
TW_UINT32 MaxValue; /* Final value in the range. */
TW_UINT32 StepSize; /* Increment from MinValue to MaxValue. */
TW_UINT32 DefaultValue; /* Power-up value. */
TW_UINT32 CurrentValue; /* The value that is currently in effect. */
} TW_RANGE, FAR * pTW_RANGE;
这是我的映射 (thnx JNAerator)
public static class TW_RANGE extends Structure {
/** C type : TW_UINT16 */
public short ItemType;
/** C type : TW_UINT32 */
public NativeLong MinValue;
/** C type : TW_UINT32 */
public NativeLong MaxValue;
/** C type : TW_UINT32 */
public NativeLong StepSize;
/** C type : TW_UINT32 */
public NativeLong DefaultValue;
/** C type : TW_UINT32 */
public NativeLong CurrentValue;
public TW_RANGE() {
super();
}
protected List<? > getFieldOrder() {
return Arrays.asList("ItemType", "MinValue", "MaxValue", "StepSize", "DefaultValue", "CurrentValue");
}
}
当我向扫描仪请求这个实体时,扫描仪发回填充对象,但是当我通过
创建它时
new TW_RANGE(pointer)
它returns我一些有线的东西
TwaindsmLibrary$TW_RANGE(native@0x157c000c) (22 bytes) {
short ItemType@0=870
NativeLong MinValue@2=1572916
NativeLong MaxValue@6=5500
NativeLong StepSize@a=2097152
NativeLong DefaultValue@e=5500
NativeLong CurrentValue@12=2621440
}
- 如何解释这些值?
- 我可以转储本机结构并使用某些工具对其进行分析吗?看过Pointer.dump,但它需要转储值的大小,我怎样才能得到指针下结构的大小?
必须调用 Structure.read()
才能将本机内存复制到您的 JNA Structure
字段中。
最简单的方法是确保从 TW_RANGE(Pointer)
构造函数中调用 Structure.read()
作为最后一个语句。
JNA 通常在进行函数调用时自动调用 Structure.read()/write()
。它有意 而不是 在 Structure
构造函数中这样做,让程序员决定执行该同步的最佳点(如果有的话)。
我明白了!
在调试 C++ 代码之后,我发现 (TW_RANGE*)pointer 和 Java 一样乱七八糟。但是 (TW_RANGE**)pointer 就像一个魅力。
所以
new TW_RANGE(pointer.getPointer(0))
[掌声]
该解决方案导致我出现随机内存访问错误。
我应该使用 Twain 本机 MemAllocate/Lock/Free 函数,这些函数 returns 来自给定指针的正确值。
我正在围绕 JNA 适配器跳舞 "twain.h" - 几乎做到了,但在获取扫描器功能方面仍然存在一些问题。 有一个原始实体:
typedef unsigned short TW_UINT16, FAR *pTW_UINT16;
typedef unsigned long TW_UINT32, FAR *pTW_UINT32;
typedef struct {
TW_UINT16 ItemType;
TW_UINT32 MinValue; /* Starting value in the range. */
TW_UINT32 MaxValue; /* Final value in the range. */
TW_UINT32 StepSize; /* Increment from MinValue to MaxValue. */
TW_UINT32 DefaultValue; /* Power-up value. */
TW_UINT32 CurrentValue; /* The value that is currently in effect. */
} TW_RANGE, FAR * pTW_RANGE;
这是我的映射 (thnx JNAerator)
public static class TW_RANGE extends Structure {
/** C type : TW_UINT16 */
public short ItemType;
/** C type : TW_UINT32 */
public NativeLong MinValue;
/** C type : TW_UINT32 */
public NativeLong MaxValue;
/** C type : TW_UINT32 */
public NativeLong StepSize;
/** C type : TW_UINT32 */
public NativeLong DefaultValue;
/** C type : TW_UINT32 */
public NativeLong CurrentValue;
public TW_RANGE() {
super();
}
protected List<? > getFieldOrder() {
return Arrays.asList("ItemType", "MinValue", "MaxValue", "StepSize", "DefaultValue", "CurrentValue");
}
}
当我向扫描仪请求这个实体时,扫描仪发回填充对象,但是当我通过
创建它时new TW_RANGE(pointer)
它returns我一些有线的东西
TwaindsmLibrary$TW_RANGE(native@0x157c000c) (22 bytes) {
short ItemType@0=870
NativeLong MinValue@2=1572916
NativeLong MaxValue@6=5500
NativeLong StepSize@a=2097152
NativeLong DefaultValue@e=5500
NativeLong CurrentValue@12=2621440
}
- 如何解释这些值?
- 我可以转储本机结构并使用某些工具对其进行分析吗?看过Pointer.dump,但它需要转储值的大小,我怎样才能得到指针下结构的大小?
Structure.read()
才能将本机内存复制到您的 JNA Structure
字段中。
最简单的方法是确保从 TW_RANGE(Pointer)
构造函数中调用 Structure.read()
作为最后一个语句。
JNA 通常在进行函数调用时自动调用 Structure.read()/write()
。它有意 而不是 在 Structure
构造函数中这样做,让程序员决定执行该同步的最佳点(如果有的话)。
我明白了!
在调试 C++ 代码之后,我发现 (TW_RANGE*)pointer 和 Java 一样乱七八糟。但是 (TW_RANGE**)pointer 就像一个魅力。
所以
new TW_RANGE(pointer.getPointer(0))
[掌声] 该解决方案导致我出现随机内存访问错误。 我应该使用 Twain 本机 MemAllocate/Lock/Free 函数,这些函数 returns 来自给定指针的正确值。