我最近在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>
!
答案 0 :(得分:5)
您只能使用其他界面扩展接口。我不知道为什么在访问现有API时需要这些功能 - 即使是在Java中也是如此。只需实施它并完成它。
编辑:通常,根据我的经验,用纯Java编写接口要清楚得多;在clojure中定义一个新接口的通常原因是你想要为一些clojure代码添加一个Java友好的接口。
再次编辑:如果您发现这种情况更具吸引力,您可以使用definterface。 This blog post有一些使用它来访问JNA的例子。