我有一个C函数(编译为DLL),该函数接受WinDef.RECT对象并打印出四个坐标:

DllExport void Test(RECT rect)
{
    printf("Rect: %i, %i, %i, %i", rect.top, rect.left, rect.bottom, rect.right);
}

在Java(JNA)方面,我尝试将其传递给WinDef.RECT,如下所示:
WinDef.RECT rect = new WinDef.RECT();
rect.bottom=0;
rect.left=0;
rect.right=0;
rect.top=0;
jna.INSTANCE.Test(rect);

但是,我只是胡说八道(数字不一致,并且每次都在变化),例如:
Rect: -857788769, 11343200, 8044544, 8044544

我假设我没有在JNA端正确定义RECT(可以从同一dll中的其他本机函数调用C++函数),但除此之外,我还有点停滞!

最佳答案

在JNA邮件列表上,我得到了一个有用的答案:



在我的情况下,我需要保持本机库不变,因此解决方案是声明WinDef.RECT的子类,并使用Structure.ByValue对其进行标记:

public static class RectByValue extends WinDef.RECT implements Structure.ByValue {}

然后可以使用它代替WinDef.RECT,所有这些似乎都可以正常工作。

请注意,尽管此修复程序对我来说还可以,但是其他人也报告了其他情况-如下面的注释所示,将类型切换为LPRECT是另一个潜在的修复程序。

关于java - 在JNA中分配WinDef.RECT结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29859749/

10-14 04:24