0

使用 JNA,我构建了一个 api 来使用Carbon框架从 Mac 接收操作系统事件。现在,有一个函数Carbon.framework定义为:

OSStatus ReceiveNextEvent (
ItemCount inNumTypes, //ItemCount is a 32-bit iteration count
const EventTypeSpec *inList, //EventTypeSpec is a structure
EventTimeout inTimeout,//EventTimeout is double-length integer of type EventTime
Boolean inPullEvent,
EventRef *outEvent
);

文档是这样说的:

inNumTypes

要等待的事件类型数(如果有任何事件应该导致此函数返回,则为 0)。在列表中。我们正在等待的事件类型列表(如果任何事件应该导致此函数返回,则传递 NULL)。

inTimeout 返回前等待的时间(最好通过 kEventDurationForever)。

inPullEvent 为该参数传递 true 以从队列中移除下一个匹配事件。

outEvent 指向与传入列表匹配的下一个事件的指针。如果您在 inPullEvent 参数中传递 true,则该事件归您所有,完成后您应该释放它。

返回值 指示是否接收到事件、超时到期或退出当前事件循环的结果。有关可能的值,请参见“碳事件管理器结果代码”(第 257 页)。讨论

此函数尝试获取指定类型的下一个事件。如果事件队列中没有事件匹配,此函数将运行当前事件循环,直到匹配的事件到达,或超时到期。除了计时器触发之外,您的应用程序在此函数内部时会被阻止等待事件到达。

同样,我在 JNA 通话中写了以下内容:

NativeLong ReceiveNextEvent(NativeLong inNumTypes, EventTypeSpec[] inList,float inTimeout ,boolean inPullEvent, EdSdkLibrary.__EdsObject outEvent);

__EdsObject延伸PointerType

public static class __EdsObject extends PointerType {
    public __EdsObject(Pointer address) {
        super(address);
    }
    public __EdsObject() {
        super();
    }
};

EventTypeSpec is:
public class EventTypeSpec extends Structure {

    public int eventClass;
    public int eventKind;

    protected List getFieldOrder() {
        return Arrays.asList(new String[]{"eventClass", "eventKind"});
    }
}

和电话是carbon.ReceiveNextEvent(new NativeLong(1), null, 1.0f, true, eventRef)

天知道为什么,但这条线索并没有从声明中出来。有趣的是,它确实会获取事件并分发它们,但不会出来。它与我定义函数的方式有关吗?

4

1 回答 1

1

您的映射不正确,并且您没有提供本机代码可以将事件写入其中的事件结构。

NativeLong ReceiveNextEvent(NativeLong inNumTypes, EventTypeSpec[] inList, double inTimeout, byte inPullEvent, Pointer outEvent);

必须为本地代码提供足够大小的缓冲区outEvent来写入事件数据(您只提供了一个未初始化的指针,因此当您的方法签名实际上正确时会崩溃)。

float您没有使用而不是参数崩溃的事实double只是偶然的。实际发生的情况是,之前的所有参数都inTimeout被写入堆栈中的错误位置,因此您的结果将是未定义的。

但是,我不明白您为什么要查看这些事件的操作系统事件队列。根据 EDSDK 文档,事件被发送到直接在 EDSDK 库中注册的回调。我在文档或 EDSDK 示例代码中都没有提到操作系统事件队列。

于 2013-04-03T08:50:00.087 回答