Java JNA错误的结构字段值
我正在围绕twain.h的JNA适配器跳舞-几乎做到了,但在获取扫描仪功能方面仍然存在一些问题。 有一个原始的秘密:Java JNA错误的结构字段值,java,c++,mapping,jna,Java,C++,Mapping,Jna,我正在围绕twain.h的JNA适配器跳舞-几乎做到了,但在获取扫描仪功能方面仍然存在一些问题。 有一个原始的秘密: 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 i
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
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");
}
}
它还给我一些有线的东西
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.read作为最后一条语句从TW_RANGEPointer构造函数调用
JNA通常在进行函数调用时自动调用Structure.read/write。它故意不在结构构造函数中这样做,让程序员决定执行同步的最佳点(如果有的话)。我明白了!
在调试C++代码后,我发现TWiSn值器指针与java一样混乱。但TW_RANGE**指针的工作方式很有魅力。
所以
[掌声]
这个解决方案会导致随机内存访问错误。
我应该使用Twain原生MemAllocate/Lock/Free函数,它从给定指针返回正确的值。我知道这已经有一年多了,但我偶然发现了这一点,并注意到您正在使用NativeLong,它可以是32位或64位,以映射到特定声明的32位变量。您应该在结构中使用int。感谢您的评论。因为只使用x32驱动程序,所以仍然没有机会体验它。
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
}
new TW_RANGE(pointer.getPointer(0))