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
}
  1. 如何解释这些值?
  2. 我可以转储本机结构并使用某些工具对其进行分析吗?看过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 来自给定指针的正确值。