我在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
}
答案 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函数,它们从给定的指针返回正确的值。