【发布时间】:2015-07-03 18:45:28
【问题描述】:
我有一个 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 中的其他本机函数很好地调用),但除此之外我有点卡住了!
【问题讨论】:
-
我注意到,当我将 32 位 JRE 与 32 位版本的 DLL 一起使用时,我遇到了同样的问题,而在 64 位版本上一切正常。
-
@regulus 感谢您的观察 - 在这种情况下,您会建议这是 JNA 错误吗? (不幸的是,我的用例将我限制为 32 位堆栈。)
-
请注意 w32 API 在 32 位上使用
stdcall调用约定,但在 64 位上不使用。确保如果您的本机库使用stdcall,则您的 JNA 映射实现StdCallLibrary。