java.lang.UnsatisfiedLinkError даже при настройке -Djava.library.path

Я загружаю библиотеку в свой код Java. Я поместил библиотеку в папку sytem 32, а также установил -Djava.library.path.

Раньше этот код работал

try{


        System.loadLibrary("resources/TecJNI");

        System.out.println("JNI library loaded \n");
    }
    catch(UnsatisfiedLinkError e){
        System.out.println("Did not load library");
        e.printStackTrace();
    }

но с прошлой недели он показывает

java.lang.UnsatisfiedLinkError: no resources/TecJNI in java.library.path.

Это какая-то проблема с правами доступа к файлу для dll, которую я загружаю в java-код ИЛИ dll, используемую каким-либо другим приложением.

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

Может ли кто-нибудь предложить мне?

РЕДАКТИРОВАТЬ: я использую -

Djava.library.path="${workspace_loc}/org.syntec.ivb.application/resources;${env_var:PATH}"

в моих аргументах eclipse vm. Я думаю, что это использует это.


person code_fish    schedule 13.08.2013    source источник
comment
loadLibrary ожидает имя библиотеки, тогда как resources/TecJNI на самом деле не похоже на действительное имя библиотеки. Является ли «ресурс» каталогом в каталоге system32? Также как именно вы определяете java.library.path?   -  person Naytzyrhc    schedule 13.08.2013
comment
Я думаю, что использую настройки аргументов eclipse vm. Не система 32. Я обновил вопрос.   -  person code_fish    schedule 13.08.2013
comment
хорошо, тогда вы можете попробовать использовать System.loadLibrary (TecJNI)?   -  person Naytzyrhc    schedule 13.08.2013


Ответы (3)


System.loadLibrary ожидает имя библиотеки, а не путь. Путь к каталогу, содержащему библиотеку, должен быть указан в переменной env PATH (Windows) или в -Djava.library.path

person Evgeniy Dorofeev    schedule 13.08.2013
comment
Я использую -Djava.library.path=${workspace_loc}/org.syntec.ivb.application/resources;${env_var:PATH} в аргументах eclipse vm. Я думаю, что это использует это. - person code_fish; 13.08.2013
comment
Спасибо. теперь работает ровно. Но не знаю, что та же конфигурация работала нормально. У меня была dll в папке ресурсов, и с помощью -Djava.library.path=${workspace_loc}/org.syntec.ivb.application/resources;${env‌​_var:PATH} он подбирал библиотеку. Теперь я использую -Djava.library.path=C:/Windows/System32 и System.loadLibrary(TecJNI) - person code_fish; 13.08.2013
comment
на самом деле C:/Windows/System32 должен быть в Windows PATH, попробуйте без -Djava.library.path=C:/Windows/System32 - person Evgeniy Dorofeev; 13.08.2013
comment
@arun Не рекомендуется помещать файлы приложений в системные папки. Этого должно быть довольно легко избежать. Используемая вами среда разработки Eclipse использует собственные библиотеки для SWT и нормально работает после распаковки. - person Tom Blodget; 13.08.2013

когда дело доходит до загрузки библиотек в jvm, мне нравится копировать библиотеки во временный каталог, а затем загружать их из временного каталога. вот код:

private synchronized static void loadLib(String dllPath,String libName) throws IOException {
    String osArch = System.getProperty("os.arch").contains("64")?"_X64":"_X86";
    String systemType = System.getProperty("os.name");
    String libExtension = (systemType.toLowerCase().indexOf("win") != -1) ? ".dll"
            : ".so";
    String libFullName = libName+osArch+ libExtension;
    String nativeTempDir = System.getProperty("java.io.tmpdir");

    InputStream in = null;
    BufferedInputStream reader = null;
    FileOutputStream writer = null;

    File extractedLibFile = new File(nativeTempDir + File.separator
            + libFullName);
    if (!extractedLibFile.exists()) {
        try {
            in = new FileInputStream(dllPath+ File.separator+
                    libFullName);
            reader = new BufferedInputStream(in);
            writer = new FileOutputStream(extractedLibFile);

            byte[] buffer = new byte[1024];

            while (reader.read(buffer) > 0) {
                writer.write(buffer);
                buffer = new byte[1024];
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null)
                in.close();
            if (writer != null)
                writer.close();
        }
    }
    System.load(extractedLibFile.toString());
}
person Winston    schedule 13.08.2013
comment
хороший способ. Я обязательно попробую. +1 - person code_fish; 13.08.2013

Зачем вам дополнительные «ресурсы»?

При использовании System.loadLibrary("resources/TecJNI"); вы ищете TecJNI.dll в подпапке "resources" java.library.path. Поэтому, если вы поместите C:\windows\system32 в путь к библиотеке (что вам не понадобится, поскольку по умолчанию он находится в пути поиска), ваша библиотека должна быть C:\windows\system32\resources\TecJNI.dll

person piet.t    schedule 13.08.2013
comment
Я использую -Djava.library.path=${workspace_loc}/org.syntec.ivb.application/resources;${env var:PATH} в аргументах eclipse vm. Я думаю, что это использует это. - person code_fish; 13.08.2013