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

3

我正在设计这个Java Web Applet来通过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%,但是当我这样做时视频仍无法渲染,并且错误消失了(此时,我不确定正在发生什么)。我还尝试通过依赖项查找器运行xuggle-5.dll,尽管如下截图所示,我只得到了与IESHIM.dll相关的错误:enter image description here。当我在Windows XP和Ubuntu 10.04机器上运行时,也会出现与IESHIM.dll相同的错误。
我还在用于启动Web Applet的HTML文档中的<applet>标签下引用了xuggle-xuggler.jar文件。
目前,我真的不知道为什么Xuggler不能在我用于开发的Windows 7(32位)机器上运行。对此事的任何帮助都将不胜感激。
需要注意的是,我正在尝试运行Xuggle 5.4的GPL版本(与之前的版本不同,它不需要安装),该版本可在Xuggle网站上获得。
以下是我的HTML文档片段:
<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文档,或者最好提供链接以便我们查看。 - Andrew Thompson
顺便提一下,使用JNLP部署小程序时,使用本地程序更容易。 - Andrew Thompson
@Andrew Thompson:我已经添加了一段HTML代码片段,用于嵌入Java Web小程序。 - Justin
  1. 使用 deployJava.js 部署小程序(有关详细信息,请参见小程序信息页面)。 2) 由于它具有本地文件,因此请使用 JWS / JNLP 进行部署。这使得将本地文件放在类路径上变得简单。以下是一个示例,它使用 JNLP 部署 Xuggle 本地文件和 API。
- Andrew Thompson
1个回答

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文件的副本,这很可能来自我两个月前用于实验Java小程序视频输出的旧Xuggle JAR归档文件。通过以上的依赖关系检查工具,我们得出结论,临时目录中引用的DLL文件(C:\Users\Justin\AppData\Local\Temp\xuggle\xuggle8376027568348573783.dll)与最近从最新的xuggle-xuggler-5.4.jar中提取的xuggle DLL文件有不同的依赖关系。
因此,在我尝试在Java Web Applet中显示视频时,Java运行时环境会尝试访问这个老的Xuggle DLL文件,而不是从xuggle-xuggler-5.4.jar中加载DLL文件。因此,就会发生上述的java.lang.UnsatisfiedLinkError错误。
为了强制Java运行时环境从xuggle-xuggler-5.4.jar内部加载DLL文件,执行了以下步骤:
  1. 打开Java控制面板。在Windows中,可以通过开始菜单访问控制面板来完成此操作。如果安装了Java运行时环境,则Java应该出现在Windows控制面板中的选项中。点击Java。

  2. 一旦进入Java控制面板,在"常规"选项卡下,在"临时互联网文件"下,点击"设置..."按钮。

  3. 取消选中"在计算机上保存临时文件"复选框。

  4. 然后点击"删除文件"按钮并删除所有临时文件(选择所有复选框)。根据您的喜好,您可能只想选择其中的一部分复选框,但我选择了全部。

  5. 点击"确定"。然后再次点击"确定"。然后第三次点击"确定"以关闭Java控制面板。

  6. 关闭您的网络浏览器,如果它正在运行,请尝试重新启动Java Web Applet。如果这是您遇到的问题,那么java.lang.UnsatisfiedLinkError错误将不再发生,并且视频应该正常显示,假设您的代码正确,并且已经加载了正确的Xuggle JAR和Xuggle依赖项。在我的情况下,我的Web Applet JAR文件只是放置在与用于在Web浏览器中嵌入它的HTML文件相同的目录中,以及所有所需的Xuggle JAR和Xuggle依赖项JAR。

需要翻译的内容:

需要注意的是,在Ubuntu中的Java Runtime Environment也有类似于Windows中的Java控制面板,如果在Ubuntu上出现问题,可以执行类似的步骤来解决。

如果您只是在网页浏览器中直接打开HTML文件,则上述解决方案应该有效。如果您正在使用Apache Tomcat或Glassfish部署Web applet,则可能无法正常工作-在这种情况下,您可能需要参考此解决方案,尽管我自己没有进行全面测试:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接