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

时间:2011-03-29 22:28:43

标签: clojure jna

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

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

但是,我有点难以将例子从Java翻译成Clojure。我知道我可以implement interfaces and implement classes,但我怎样才能扩展界面


感谢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))

按预期输出#<Pointer native@0xffffffff>

1 个答案:

答案 0 :(得分:5)

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

编辑:通常,根据我的经验,用纯Java编写接口要清楚得多;在clojure中定义一个新接口的通常原因是你想要为一些clojure代码添加一个Java友好的接口。

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