He estado buscando mucho en Clojure recientemente y me he estado preguntando si se adapta al alcance de mi próximo proyecto. Desafortunadamente, implica escribir código no portátil y necesito acceder a la API de Win32.Ampliación (no implementación) de las interfaces Java en Clojure
Me encontré con la biblioteca Java Native Access para mapear fácilmente las bibliotecas nativas con una interfaz C en Java. Incluso proporciona un contenedor (vacío) para Kernel32.dll
como ejemplo en el tutorial.
Sin embargo, estoy un poco perplejo en cuanto a traducir los ejemplos de Java a Clojure. Sé que puedo implement interfaces and implement classes, pero ¿cómo puedo simplemente extender una interfaz?
Gracias al enlace publicado por Joost, aquí es un ejemplo de trabajo mínima:
(import (com.sun.jna Library Native Platform Pointer))
(import (com.sun.jna.win32 StdCallLibrary))
(def K32
(gen-interface
:name Kernel32
:extends [com.sun.jna.win32.StdCallLibrary]
:methods [[GetCurrentProcess [] com.sun.jna.Pointer]]))
(defn load-native-library [name interface]
(cast interface (com.sun.jna.Native/loadLibrary name interface)))
(def k32 (load-native-library "kernel32" K32))
(println (.GetCurrentProcess k32))
salidas #<Pointer [email protected]>
, como se esperaba!
Porque el código JNA parece generar la clase de respaldo para mí. Consulte la sesión "Cómo comenzar a usar JNA" en el enlace publicado. –
Tenga en cuenta que 'clojure.core' proporciona mecanismos para definir interfaces Java en Clojure. Ver http://clojuredocs.org/clojure_core/1.2.0/clojure.core/definterface. Sin embargo, no parece ser compatible con la extensión de una interfaz * existing *. Esto parece una gran limitación. –
@Andre: OK, mi java está lo suficientemente oxidada como para no poder ver si realmente necesitas definir una nueva interfaz allí o si puedes salirte con la tuya. Estoy actualizando mi respuesta nuevamente. –