Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNA错误的结构字段值_Java_C++_Mapping_Jna - Fatal编程技术网

Java 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

我正在围绕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 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))