在JNA中分配WinDef.RECT结构

时间:2015-04-25 00:50:33

标签: java c++ jna

我有一个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中的其他本机函数中调用),但除此之外我还是位卡住!

1 个答案:

答案 0 :(得分:0)

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

  

您的本机签名是要求struct,而您的JNA映射默认为struct *语义。更改本机sig或使用Structure.ByValue;除非您明确需要,否则首选* *。

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

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

然后可以使用它代替WinDef.RECT,并且所有内容似乎都没有问题。

请注意,虽然此修复程序对我来说没问题,但其他人已经报告了 - 如下面的评论中所示,将类型切换为LPRECT是另一种可能的修复方法。