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

可能不是库的问题,而是调用方式的问题。不幸的是,我对原生代码的了解不足,无法建议如何进行调试。也许你可以先尝试使用 Java 而不使用 Clojure 来使其工作。

0

我无法对原生库的使用发表评论,但如果一个包装器能满足您的需求,我已在Clojure项目中成功使用https://github.com/a-schild/jave2来驱动ffmpeg可执行文件。

还有其他选项可以将ffmpeg可执行文件直接包装在Clojure中,但这并不能真正帮助我,但感谢你的提示。我可能会选择其中之一,但我想尝试直接访问库。另一种选择是使用org.byte.deco的ffmpeg包装器,但我希望减少依赖项的数量。
0
...