Часто пользователи Clojure хотят быть как можно более ленивыми и задерживать создание классов и объектов. В том же духе, если я хочу вызвать встроенную функцию, которая разрешена во время выполнения изнутри Java, я могу использовать com.sun.jna.Function.getFunction("foolibrary", "foofuncname")
, который возвращает com.sun.jna.Function
, который может быть invoked
.В Java и с помощью Bridj, как вы можете динамически вызывать любую собственную функцию?
В Clojure это выглядит следующим образом:
(let [f (com.sun.jna.Function/getFunction "c" "printf")]
(.invoke f Integer (to-array ["Hello World"])))
BridJ, с другой стороны, предлагает привлекательные преимущества в производительности и утверждал, проще API, однако, до сих пор мне не ясно, как использовать BridJ, чтобы сделать что-то аналогично примеру JNA, связанному с исполнением. Может ли кто-нибудь продемонстрировать, как? Кроме того, если это возможно, существуют ли какие-либо штрафы за производительность при таком подходе? В противном случае, он кажется, что генерация исходного файла Java раньше времени является единственным решением. Буду признателен, если кто-то сможет это подтвердить.
Я думаю, что я не был достаточно ясен о своем вопросе, и я обновил формулировку. Я спрашиваю, возможно ли время выполнения/отсрочка привязки. Ваш ответ требует генерации кода Java, который должен быть скомпилирован и загружен вовремя, а не как раз вовремя. – bmillare
ОК, я думаю, что я поняла, но я также опасаюсь, что BridJ не будет отображаться. (никоим образом не вокруг JNAerator ... определенно не в пределах 2-3 строк!) Я бы придерживался вашего текущего продукта, который также является «не стандартным java». но (ранее) это https://java.net/projects/jna/ и в настоящее время это https://github.com/twall/jna/ project/product. – xerx593
Ответ, в котором говорится, что это невозможно, остается верным ответом. Я дам вам очки, если в ближайшие оставшиеся часы ничего не появится. – bmillare