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

时间:2013-02-20 15:57:42

标签: java windows-7 applet japplet xuggle

我正在设计这个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%,但是当我这样做时,视频仍然无法呈现所以,错误消失了(在那一点上,我不确定发生了什么)。我也试过通过依赖walker运行xuggle-5.dll,虽然我得到的是IESHIM.dll的错误,如下面的截图所示:

enter image description here

当然,当我在Windows XP和Ubuntu 10.04计算机上运行时,会出现与IESHIM.dll相同的错误。

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

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

作为一个注释,我试图在Xuggle网站上使用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>  

1 个答案:

答案 0 :(得分: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 Runtime Environment有一个Xuggle DLL文件的缓存副本,它可能来自我两个月前用来试验Java applet视频输出的旧的Xuggle JAR档案。我们能够得出这个结论,因为临时目录(C:\Users\Justin\AppData\Local\Temp\xuggle\xuggle8376027568348573783.dll)中引用的DLL文件与从最近的{{1}中提取的最新xuggle DLL文件相比具有不同的依赖性。通过上面的Dependency Walker应用程序验证时。

因此,当我尝试在Java Web Applet中显示视频时,Java Runtime Environment会尝试访问这个老化的Xuggle DLL文件,而不是从xuggle-xuggler-5.4.jar中加载DLL文件。因此,发生了上述xuggle-xuggler-5.4.jar

为了强制Java Runtime Environment从java.lang.UnsatisfiedLinkError内的DLL文件中加载DLL文件,执行了以下步骤:

  1. 打开Java控制面板。在Windows中,可以通过转到“开始”菜单并访问“控制面板”来完成此操作。如果安装了Java运行时环境,则Java应作为Windows控制面板中的选项显示。单击Java。

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

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

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

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

  6. 如果Web浏览器处于打开状态,请将其关闭并尝试重新启动Java Web Applet。如果这是您遇到的问题,那么xuggle-xuggler-5.4.jar应该不再出现,并且应该正确显示视频,假设您的代码是正确的,并且您已经加载了正确的Xuggle JAR以及Xuggle的依赖项。就我而言,我的Web applet JAR只是放在与用于将其嵌入Web浏览器的HTML文件相同的目录中,以及所有必需的Xuggle JAR和Xuggle依赖JAR。

  7. 应该注意的是,Ubuntu中的Java Runtime Environment也有一个类似于Windows中的Java控制面板,如果出现问题,可以执行类似的步骤来解决Ubuntu中的这个问题。

    如果您只是直接在Web浏览器中打开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