代码之家  ›  专栏  ›  技术社区  ›  Ivan Tamashevich

JNA错误的结构字段值

  •  0
  • Ivan Tamashevich  · 技术社区  · 9 年前

    我正在围绕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 JN曝气器)

    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");
            }
    }
    

    当我向scanner请求此实体时,scanner会向我发送回填充对象,但当我通过

    new TW_RANGE(pointer)
    

    它还给我一些有线的东西

    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,但它需要转储值的大小,我如何才能获得指针下结构的大小?
    2 回复  |  直到 9 年前
        1
  •  0
  •   gpmcadam    9 年前

    Structure.read() 必须调用才能将本机内存复制到JNA中 Structure 领域。

    最简单的方法是确保 结构.read() 从您的 TW_RANGE(Pointer) 构造函数作为最后一条语句。

    JNA通常调用 Structure.read()/write() 在进行函数调用时自动执行。它故意这样做 在中执行 结构 构造函数,让程序员决定执行同步的最佳点(如果有的话)。

        2
  •  0
  •   Ivan Tamashevich    8 年前

    我得到了它! 在对C++代码进行少量调试后,我发现(TW_RANGE*)指针和Java一样混乱。但是(TW_RANGE**)指针就像一个符咒。 所以

    new TW_RANGE(pointer.getPointer(0))
    

    [掌声] 这个解决方案导致了随机内存访问错误。 我应该使用Twain本机MemAllocate/Lock/Free函数,该函数从给定指针返回正确的值。