Java applet问题:dll已经加载到另一个类加载器中

时间:2011-12-30 15:05:31

标签: java applet java-native-interface classloader

我需要创建一个加载本地DLL的Java applet。它工作正常,但只是第一次。如果我刷新页面,它总是抱怨抛出以下异常:

Exception: java.lang.RuntimeException: java.lang.UnsatisfiedLinkError: Native Library E:\test.dll already loaded in another classloader

关于如何解决此问题的任何想法?

这是我的代码:

public class NativeWrapper
{
    public native String GetIP();

    public NativeWrapper(final String nativeLib) {
        try {
            System.load(nativeLib);
        } catch (UnsatisfiedLinkError e) {
            System.out.println("UnsatisfiedLinkError exception" + e);
        }
    }
}

小程序代码:

public class MyApplet extends Applet {

    private static NativeWrapper dll = new NativeWrapper("e:/test.dll");

    public MyApplet () {
    }

    // to be called by javascript on html page
    public string GetIPAddress() {
        return dll.GetIP();
    }
}

我在这个问题上已经阅读了很多,但仍然无法找到解决方案。有人可以帮忙吗?提前谢谢。

2 个答案:

答案 0 :(得分:3)

This article似乎提供了一些很好的建议,以确保您为每个applet调用获得相同的ClassLoader

答案 1 :(得分:1)

我通过在html页面上的applet标记添加以下代码段解决了同样的问题。

<param name="classloader_cache" value="false">

我在applet的JNLP文件中有以下param。这可能也很重要。

<applet-desc ...>
    <param name="separate_jvm" value="true"/>
</applet-desc>