В последнее время я много смотрел на Clojure, и мне было интересно, подходит ли он для моего следующего проекта. К сожалению, это связано с написанием непереносимого кода, и мне нужен доступ к Win32 API.
Я наткнулся на библиотеку Native Access Java для простого отображения собственных библиотек с интерфейсом 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))
Выходы #<Pointer native@0xffffffff>
, как и ожидалось!