2024 Clojure现状调查!中分享您的想法。

欢迎!请查看关于页面以了解更多关于它是如何运作的信息。

0
Java互操作

大家好,我在尝试使用JNA调用C库(在Windows平台和vscode上)时遇到了问题。

我从: https://www.gyan.dev/ffmpeg/builds/ 获取了ffmpeg共享库的副本。
特别是: https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full-shared.7z

我将bin子目录的内容放入了我的clojure项目的'lib'目录中。我还将此目录添加到我的路径,并且可以愉快地调用ffmpeg应用程序。

这是我deps.edn的目录内容

{:deps
 {net.java.dev.jna/jna   {:mvn/version "5.6.0"}}
 :paths ["src" "lib"]
 }

下面是代码

 (ns jnatest)

(import (com.sun.jna  Native Pointer))

(gen-interface
 :name jna.lib_avformat
 :extends [com.sun.jna.Library]
 :methods [[avformat_alloc_context [] Pointer]])

(def avformat
  (Native/loadLibrary "avformat-58" jna.lib_avformat))

在调用Native/loadLibrary时收到错误

; 执行错误(UnsatisfiedLinkError)在com.sun.jna.Native/open(Native.java:-2)。
; %1不是有效的Win32应用程序。

我最初使用了techascent的jna实现, https://clojars.org/techascent/tech.jna,并且遇到了类似的问题,所以我回到了基础。

我猜可能是库调用方式有问题,但在开始重新编译ffmpeg所有库之前,我想问问是否有什么简单的方法可以尝试。

任何提示都很有欣赏价值。

3 答案

0

这可能是库的问题,而不是它被调用的方式。遗憾的是,我对原生内容了解不够,无法建议如何调试。也许您可以先尝试在不使用Clojure的情况下用Java让它工作。

0

我对本地库名的使用无法发表评论,但如果 wraps 符合您的需求,我已成功在 Clojure 项目中使用 https://github.com/a-schild/jave2 控制 ffmpeg 可执行文件。

还有其他方法直接从 Clojure 中包装 ffmpeg 可执行文件,但这对我帮助不大。不过感谢这个提示。我可能最终会选择其中之一,但我想尝试直接访问库。另一个选择是使用 org.byte.deco 的 ffmpeg 包装器,但我想减少依赖项的数量。
0
...