studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java macos jni jna

java - para - manual de programacion android pdf



Obtener eventos del sistema operativo (1)

Trabajo en Windows, pero estoy atrapado aquí en Mac. Tengo el Canon SDK y he construido un contenedor JNA sobre él. Funciona bien en Windows y necesita ayuda con Mac. En el SDK, hay una función donde se puede registrar una función de devolución de llamada. Básicamente, cuando ocurre un evento en la cámara, llama a la función de devolución de llamada.

En Windows, después de registrarme, necesito usar User32 para obtener el evento y enviar el evento de la siguiente manera:

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 }

En la API, no encuentro una clase similar en Mac. ¿Cómo voy sobre este?

PD: La API de JNA para Unix es extensa y no pude encontrar qué buscar. La referencia podría ayudar


Esta solución está utilizando el marco de Cocoa. Cocoa está en desuso y no tengo conocimiento de ninguna otra solución alternativa. Pero el siguiente funciona como el encanto.

Finalmente encontré la solución usando Carbon framework Carbon . Aquí está mi interfaz MCarbon que define las llamadas que necesito.

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 }

La solución al problema se resuelve con la siguiente función:

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

Esto hace el trabajo. Según la documentación -

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.

Además, si no es ReceiveNextEvent , entonces otras funciones como las mencionadas en la clase MCarbon anterior serían útiles.

Creo que la documentación del marco de Carbon daría más ideas y flexibilidad para resolver el problema. Además de Carbon , en foros la gente mencionó cómo resolver el uso de Cocoa , pero no conozco ninguno.

Editar: Gracias a technomarge , más información aquí