在Clojure中扩展(不实现)Java接口

And*_*ron 5 clojure jna

我最近在Clojure看了很多,我一直在想它是否适合我下一个项目的范围.不幸的是,它涉及编写不可移植的代码,我需要访问Win32 API.

我偶然发现了Java Native Access库,可以轻松地将带有C接口的本机库映射到Java.它甚至提供了一个(空的)包装器Kernel32.dll作为教程中的一个例子!

但是,我有点难过将例子从Java翻译成Clojure.我知道我可以实现接口和实现类,但是我怎样才能简单地扩展接口


感谢Joost发布的链接,这是一个最小的工作示例:

(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))
Run Code Online (Sandbox Code Playgroud)

输出#<Pointer native@0xffffffff>,如预期!

Joo*_*aat 5

您只能使用其他接口扩展接口.我不知道为什么在访问现有API时需要这些功能 - 即使是在Java中也是如此.只需实现它并完成它.

编辑:通常,根据我的经验,用纯Java编写接口要清楚得多; 在clojure中定义新接口的通常原因是,无论如何要为某些clojure代码添加Java友好的接口.

再次编辑:如果您发现这种情况更具吸引力,您可以使用definterface.这篇博文有一些使用它来访问JNA的例子.