JNA错误的结构字段值

时间:2015-03-21 10:56:46

标签: java c++ mapping jna

我在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)

它给我一些有线的东西

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 个答案:

答案 0 :(得分:0)

必须调用

Structure.read()才能将本机内存复制到JNA Structure字段中。

最简单的方法是确保从Structure.read()构造函数中调用TW_RANGE(Pointer)作为最后一个语句。

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

答案 1 :(得分:0)

我明白了! 在调试C ++代码之后,我发现(TW_RANGE *)指针和Java一样混乱。但是(TW_RANGE **)指针就像一个魅力。 所以

<击>
new TW_RANGE(pointer.getPointer(0))

<击> [鼓掌] 此解决方案导致我随机内存访问错误。 我应该使用Twain原生的MemAllocate / Lock / Free函数,它们从给定的指针返回正确的值。