Проблема с Java-апплетом: DLL уже загружена в другой загрузчик классов - PullRequest
1 голос
/ 30 декабря 2011

Мне нужно создать апплет Java, который загружает локальную DLL.Работает нормально, но только в первый раз.Если я обновляю страницу, она всегда жалуется, выдавая следующее исключение:

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 ]

3 голосов
/ 30 декабря 2011

Эта статья дает хороший совет, чтобы убедиться, что вы получаете одинаковые ClassLoader для каждого вызова апплета.

1 голос
/ 07 мая 2014

Я решил ту же проблему, добавив следующий фрагмент к тегу апплета на html-странице.

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

У меня есть следующий параметр в файле JNLP апплета. Это также может быть актуально.

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