25

我在 Windows 上工作,但我被困在 Mac 上。我有佳能 SDK 并在其上构建了一个JNA包装器。它在 Windows 上运行良好,在 Mac 上需要一些帮助。在 sdk 中,有一个函数可以注册一个回调函数。基本上当相机中发生事件时,它会调用回调函数。

在 Windows 上,注册后,我需要使用User32来获取事件并通过以下方式调度事件:

private static final User32 lib = User32.INSTANCE;
boolean hasMessage = lib.PeekMessage( msg, null, 0, 0, 1 ); // peek and remove
if( hasMessage ){
    lib.TranslateMessage( msg ); 
    lib.DispatchMessage( msg ); //message gets dispatched and hence the callback function is called
}

在 api 中,我在 Mac 中没有找到类似的类。我该如何处理这个?

PS:unix 的JNA api很广泛,我不知道要寻找什么。参考可能会有所帮助

4

1 回答 1

3

此解决方案使用 Cocoa 框架。Cocoa 已被弃用,我不知道有任何其他替代解决方案。但下面的作品就像魅力一样。

最后我找到了使用Carbon框架的解决方案。这是我的MCarbon接口,它定义了我需要的调用。

  public interface MCarbon extends Library {
  MCarbon INSTANCE = (MCarbon) Native.loadLibrary("Carbon", MCarbon.class);
  Pointer GetCurrentEventQueue();
  int SendEventToEventTarget(Pointer inEvent, Pointer intarget);
  int RemoveEventFromQueue(Pointer inQueue, Pointer inEvent);
  void ReleaseEvent(Pointer inEvent);
  Pointer AcquireFirstMatchingEventInQueue(Pointer inQueue,NativeLong inNumTypes,EventTypeSpec[] inList, NativeLong inOptions);
  //... so on
  }

使用以下函数解决问题的解决方案:

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

这可以完成工作。根据文档 -

This routine tries to fetch the next event of a specified type.
If no events in the event queue match, this routine will run the
current event loop until an event that matches arrives, or the
timeout expires. Except for timers firing, your application is
blocked waiting for events to arrive when inside this function.

此外,如果不是ReceiveNextEvent,那么MCarbon上面类中提到的其他功能将很有用。

我认为Carbon框架文档将为解决问题提供更多见解和灵活性。除了Carbon,在论坛上人们提到了解决 using Cocoa,但我不知道。

编辑:感谢technomarge ,这里有更多信息

于 2013-03-22T13:28:37.723 回答