无法加载 Xuggle 库:java.lang.UnsatisfiedLinkError

Posted

技术标签:

【中文标题】无法加载 Xuggle 库:java.lang.UnsatisfiedLinkError【英文标题】:Unable to load Xuggle library: java.lang.UnsatisfiedLinkError 【发布时间】:2013-02-05 17:11:52 【问题描述】:

我正在设计这个 Java Web 小程序以通过 RTSP 从视频服务器流式传输视频。为了渲染此视频,将使用 Xuggler 5.4 库 (xuggle-xuggler.jar)。目前,当我在 Windows XP 和 Ubuntu 10.04 机器上运行视频时,可以正确呈现视频。但是,当我尝试在 Windows 7 上运行它时,出现以下错误:

10:10:13.370 [Thread-13] WARN  com.xuggle.ferry.JNILibrary - Failure: library load of library: xuggle; url: C:\Users\Justin\AppData\Local\Temp\xuggle\xuggle8376027568348573783.dll; error: java.lang.UnsatisfiedLinkError: C:\Users\Justin\AppData\Local\Temp\xuggle\xuggle8376027568348573783.dll: Can't find dependent libraries
10:10:13.448 [Thread-13] ERROR com.xuggle.ferry.JNILibraryLoader - Could not load library: xuggle; version: 5; Visit http://www.xuggle.com/xuggler/faq/ to find common solutions to this problem
Exception in thread "Thread-13" java.lang.UnsatisfiedLinkError: no xuggle in java.library.path
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.loadLibrary0(Unknown Source)
    at java.lang.System.loadLibrary(Unknown Source)
    at com.xuggle.ferry.JNILibraryLoader.loadLibrary0(JNILibraryLoader.java:268)
    at com.xuggle.ferry.JNILibraryLoader.loadLibrary(JNILibraryLoader.java:171)
    at com.xuggle.ferry.JNILibrary.load(JNILibrary.java:161)
    at com.xuggle.ferry.FerryJNI.<clinit>(FerryJNI.java:16)
    at com.xuggle.ferry.Ferry.<clinit>(Ferry.java:25)
    at com.xuggle.xuggler.XugglerJNI.<clinit>(XugglerJNI.java:19)
    at com.xuggle.xuggler.ICodec$ID.<clinit>(ICodec.java:760)
    at com.ioindustries.videoserver.RtpSession.run(RtpSession.java:86)
    at java.lang.Thread.run(Unknown Source)

我尝试提取 xuggle-5.dll 并将其放置在我的 web 目录中,然后将其链接到 Windows %PATH% 甚至 Windows %CLASSPATH%,但是当我这样做时视频仍然无法呈现并且出现错误消失(那时,我不确定发生了什么)。我还尝试通过依赖项walker 运行xuggle-5.dll,尽管我得到的只是IESHIM.dll 的错误,如下面的屏幕截图所示:

当然,当我在 Windows XP 和 Ubuntu 10.04 机器上运行 IESHIM.dll 时,也会出现同样的错误。

我还在用于启动 Web 小程序的 html 文档下引用了 xuggle-xuggler.jar 文件。

此时,我真的不确定为什么 Xuggler 无法在我用于开发的 Windows 7(32 位)机器上运行。任何有关此事的帮助将不胜感激。

请注意,我正在尝试使用 Xuggle 网站上提供的 GPL 版本的 Xuggle 5.4(与以前的 Xuggle 版本不同,它不需要任何安装)。

这是我的 HTML 文档的 sn-p:

<div id="applet_box" class="applet box">
            <applet id="applet" code="com.videoserver.ClientApplet" 
                    archive="VideoServerClient.jar, xuggle-xuggler-5.4.jar, slf4j-api-1.6.4.jar, logback-classic-1.0.0.jar, logback-core-1.0.0.jar" MAYSCRIPT>
            </applet>
        </div>  

【问题讨论】:

“我还在用于启动 Web 小程序的 HTML 文档下引用了 xuggle-xuggler.jar 文件。” 显示 HTML,或者最好是链接到我们可以看到的地方。 顺便说一句。使用 JNLP 更容易为小程序部署本机。 @Andrew Thompson:我添加了用于嵌入 Java Web 小程序的 HTML 代码的 sn-p。 1) 使用deployJava.js 部署小程序(详见applet info. page)。 2)因为它有natives,所以使用JWS/JNLP来部署它。使将本地人放在类路径上变得简单。这里是an example,它使用 JNLP 来部署 Xuggle 本机和 API。 【参考方案1】:

我的同事知道为什么会出现这种java.lang.UnsatisfiedLinkError,所以所有功劳归于他(我只是一个观察者)。

参考上面错误日志的第一行:

10:10:13.370 [Thread-13] WARN  com.xuggle.ferry.JNILibrary - Failure: library load of library: xuggle; url: C:\Users\Justin\AppData\Local\Temp\xuggle\xuggle8376027568348573783.dll; error: java.lang.UnsatisfiedLinkError: C:\Users\Justin\AppData\Local\Temp\xuggle\xuggle8376027568348573783.dll: Can't find dependent libraries

基本上,在我的案例中发生的情况是 Java 运行时环境有一个 Xuggle DLL 文件的缓存副本,该文件可能来自一个旧的 Xuggle JAR 存档,我曾在两个月前用于试验 Java 小程序视频输出。鉴于临时目录 (C:\Users\Justin\AppData\Local\Temp\xuggle\xuggle8376027568348573783.dll) 中引用的 DLL 文件与通过验证时从最新的xuggle-xuggler-5.4.jar 中提取的最新 xuggle DLL 文件相比具有不同的依赖关系,我们能够得出这个结论上面的 Dependency Walker 应用程序。

因此,当我尝试在我的 Java Web Applet 中显示视频时,Java 运行时环境会尝试访问这个陈旧的 Xuggle DLL 文件,而不是从 xuggle-xuggler-5.4.jar 中加载 DLL 文件。于是,上面的java.lang.UnsatisfiedLinkError就出现了。

为了强制 Java 运行时环境从xuggle-xuggler-5.4.jar 中的 DLL 文件中加载 DLL 文件,执行了以下步骤:

    打开 Java 控制面板。在 Windows 中,这是通过转到“开始”菜单并访问“控制面板”来完成的。如果安装了 Java 运行时环境,Java 应该作为一个选项出现在 Windows 控制面板中。点击 Java。

    进入 Java 控制面板后,在常规选项卡下的 Internet 临时文件下,单击设置...按钮。

    取消选中“在我的计算机上保留临时文件”复选框。

    然后单击删除文件按钮并删除所有临时文件(选中所有复选框)。根据您的偏好,您可能只想选择这些复选框的一个子集,尽管我选择了它们。

    单击“确定”。然后再次单击确定。然后第三次单击“确定”关闭 Java 控制面板。

    如果 Web 浏览器打开,请关闭它并尝试重新启动 Java Web Applet。如果这是您遇到的问题,那么java.lang.UnsatisfiedLinkError 应该不再出现,并且视频应该正确显示,前提是您的代码是正确的并且您有正确的 Xuggle JAR 以及 Xuggle 的依赖项已加载。就我而言,我的 Web 小程序 JAR 与用于将其嵌入 Web 浏览器的 HTML 文件以及所有必需的 Xuggle JAR 和 Xuggle 依赖项 JAR 放在同一目录中。

应该注意的是,Ubuntu 中的 Java 运行时环境也有 Java 控制面板,看起来类似于 Windows 中的控制面板,如果出现问题,可以在 Ubuntu 中执行类似的步骤来解决此问题。

如果您只是直接在网络浏览器中打开 HTML 文件,上述解决方案应该可以工作。如果您使用 Apache Tomcat 或 Glassfish 来部署您的 Web 小程序,这可能不起作用 - 在这种情况下,您可能需要参考这个解决方案,尽管我自己没有彻底测试过:

http://wiki.xuggle.com/Frequently_Asked_Questions#I_get_an_.22UnsatisfiedLinkError.22_when_I_run_Xuggler-based_Applications_in_Tomcat

【讨论】:

以上是关于无法加载 Xuggle 库:java.lang.UnsatisfiedLinkError的主要内容,如果未能解决你的问题,请参考以下文章

转载:xuggle学习-IContainer2

使用 MinGW C++ 编译 64 位静态库以在 Java (JNI) 中使用

为啥进程列表时抛出 java.lang.UnsupportedOperationException [重复]

hadoop本地库无法加载

PHP 无法加载 Imagick 库 - PHP 启动:无法加载动态库

Lampp无法加载共享库