【发布时间】:2021-08-08 08:24:06
【问题描述】:
我的 Java 应用程序使用 JNA 通过制造商提供的 API 与设备驱动程序进行通信。 API 使用 Windows 消息进行通信。在执行期间的某个时间点,设备有一组作为 LPARAM 传递的数据。 LPARAM 是指向包含我需要的数据的结构向量的指针。
在 C++ 中,我可以像这样访问这些数据:
ImagesStruct *Images = { 0 };
...
Images = (ImagesStruct *)lParam;
原生的 ImagesStruct 如下所示:
typedef struct _CompressedImage
{
BYTE *pBuffer;
int BufferLen;
}
CompressedImage;
typedef struct _ImagesStruct
{
DWORD DocNumber;
CompressedImage *Images;
BOOL SnippetFront;
}
ImagesStruct;
在 Java 中,我的结构映射如下:
// ImagesStruct
public class IMAGES extends Structure {
public int DocNumber;
public COMPRESSED_IMAGE.ByReference Images; // pointer
public boolean SnippetFront;
public IMAGES() { super(); }
public IMAGES(Pointer p) { super(p); }
@Override
protected List getFieldOrder() {
return Arrays.asList("DocNumber", "Images", "SnippetFront");
}
}
// CompressedImage
public class COMPRESSED_IMAGE extends Structure {
public Pointer pBuffer; // pointer
public int BufferLen;
public COMPRESSED_IMAGE() { super(); }
public COMPRESSED_IMAGE(Pointer p) { super(p); }
@Override
protected List getFieldOrder() {
return Arrays.asList("pBuffer", "BufferLen");
}
public static class ByReference extends COMPRESSED_IMAGE implements Structure.ByReference {
public ByReference() { super(); }
public ByReference(Pointer p) { super(p); read(); }
}
}
这是我尝试在 Java 中访问该数据的众多方法之一
Pointer p = lparam.toPointer(); // this works
IMAGES pImages = new IMAGES();
IMAGES[] pa = (IMAGES[]) pImages.toArray(pImages.size()); // error here
我尝试的一切,包括上面的,似乎都会导致相同的错误消息:
JNA:回调 desktop.IDeal@1175f37 抛出以下异常: java.lang.UnsupportedOperationException: 这个指针是不透明的: 常量@0x155f0000 在 com.sun.jna.Pointer$Opaque.read(Pointer.java:1320) 在 com.sun.jna.Pointer.getByteArray(Pointer.java:726) 在 desktop.IDeal.callback(IDeal.java:199) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 com.sun.jna.CallbackReference$DefaultCallbackProxy.invokeCallback(CallbackReference.java:470) 在 com.sun.jna.CallbackReference$DefaultCallbackProxy.callback(CallbackReference.java:500) 在 com.sun.jna.Native.invokeInt(Native Method) 在 com.sun.jna.Function.invoke(Function.java:384) 在 com.sun.jna.Function.invoke(Function.java:316) 在 com.sun.jna.Library$Handler.invoke(Library.java:232) 在 com.sun.proxy.$Proxy2.GetMessage(Unknown Source) at win32.Window.run(Window.java:59) 在 java.lang.Thread.run(Thread.java:745)
我的映射是否正确?如果我无法将指针另一端的数据映射到一组 Java 对象,我该如何使用 Pointer 对象来访问该数据?
【问题讨论】: