gpt4 book ai didi

java - 在 JNA 中分配 WinDef.RECT 结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:50:30 27 4
gpt4 key购买 nike

我有一个 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(C++ 函数可以从同一 dll 中的其他 native 函数调用),但除此之外我有点卡住了!

最佳答案

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

Your native signature is asking for struct and your JNA mapping defaults to struct* semantics. Change your native sig or use Structure.ByValue; struct* is preferred unless you explicitly need otherwise.

在我的例子中,我需要 native 库保持不变,所以解决方案是声明 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com