2011-03-29 16 views
5

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!

Respuesta

5

Solo puede extender una interfaz con otra interfaz. No entiendo por qué necesitarías esa funcionalidad cuando accedes a una API existente, incluso en Java. Simplemente impleméntelo y termine con esto.

EDITAR: y por lo general, en mi experiencia, es mucho más claro escribir sus interfaces en Java puro; la razón habitual para definir una nueva interfaz en clojure es cuando desea agregar una interfaz compatible con Java a algún código de Clojure de todos modos.

EDITAR OTRA VEZ: Puede usar la interfaz Definterface si le parece más atractivo para este caso. This blog post tiene algunos ejemplos que lo utilizan para acceder a JNA.

+0

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. –

+0

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. –

+0

@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. –

Cuestiones relacionadas