2010-06-18 3 views
7

По какой-то причине я получаю отвратительную неудовлетворенную ошибку связи в своем приложении java.Неудовлетворенная ошибка связи при использовании System.loadLibrary()?

Это преступник в вопросе:

System.loadLibrary("psjw"); 

Несмотря библиотека psjw.dll явно находясь в том же исходном пакете, как этот класс.

Пожалуйста, помогите.

+1

Вы могли бы рассмотреть возможность использования System.load(). Он принимает полностью квалифицированный путь и игнорирует все переменные среды. Это просто: 'System.load (« C: \\ Program Files \\ My Great Program \\ libs \\ psjw.dll »);' Обратите внимание, что вы можете создать строку с контуром во время выполнения, поэтому вы можете сначала запросить такие вещи, как каталог пользователя, каталог, в котором установлена ​​ваша программа, и так далее. Это может быть предпочтительнее loadLibrary(), поскольку вы никогда не знаете, есть ли что-то в списке мест, поиск которых уже имеет имя «psjw.dll ", который может в конечном итоге загрузить библиотеку, которую вы не знали. –

+0

Спасибо за этот комментарий, очень полезно для выяснения основной причины проблемы с библиотекой. –

ответ

3

Попробуйте установить в явной форме путь к библиотеке при запуске JVM: -Djava.library.path="Directory of DLL"

4

Убедитесь, что psjw.dll либо на вашем PATH или java.library.path.

Ex: psjw.dll может быть в/USR/Lib, то ваша команда будет Java -Djava.library.path =/USR/Lib ur.package.UrClass

Проверьте вашу установку с помощью урезанная класс:

public class TestLoadLibrary { 

    public static void main(String[] args) { 

     String libPath = System.getProperty("java.library.path"); 
     System.out.println("java.library.path=" + libPath); 

     String libraryName = "psjw"; 
     System.out.println("Trying to load '" + libraryName + "'"); 
     System.loadLibrary(libraryName); 
    } 
} 
+0

Ну, я понимаю, что DLL должна быть в classpath для ссылки, и это не так. Должен ли путь класса .jar по умолчанию быть установлен в .jar? Поскольку компиляция и выполнение .jar не помогают. –

+2

DLL должна находиться в PATH процесса, пытающегося загрузить DLL в память. Java использует CLASSPATH для поиска классов. Загрузочный компьютер операционной системы использует PATH (в Windows) для поиска динамически загружаемых DLL-файлов. –

+1

@Aaron - Как сказал Брайан, здесь есть две разные вещи. CLASSPATH полностью отделен от PATH или java.library.path. CLASSPATH указывает на jars/classes, PATH или java.library.path на места исполняемых файлов/dll. – DeezCashews

0

что я могу сказать из своего опыта, что, если loadLib (LibraryName) выполняется из статического блока инициализации в Java класс файла, libraray должен быть существует в java.library.path. В противном случае класс не может быть загружен. Но если мы перемещаем вызов loadLibrary() с помощью других методов, например Main(), его можно прочитать из пути к среде.

0

Я работаю над этой же проблемой в течение двух дней, но в итоге нашел ответ. Сначала я создал каталог для библиотек и установил переменную среды PATH в этот каталог. Мне не нравится забивать мой путь, хотя теперь я даю вам то, что я нашел в http://blog.cedarsoft.com/2010/11/setting-java-library-path-programmatically/. Моя цветопередача следует

package yourpackage; 

import java.io.File; 
import java.lang.reflect.Field ; 

public class YourClass { 
    public native void print() ; 
    static 
    { 
     String mPath = new File (".").getAbsolutePath() ; 
     String langKey = "java.library.path" ; 
     System.setProperty (langKey, mPath) ; 

     // Tested both with and without the following, and worked either way. 
/*  try 
     { 
      Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths"); 
      fieldSysPath.setAccessible(true); 
      fieldSysPath.set(null, null); 
     } 
     catch (NoSuchFieldException e) 
     { 
      System.err.println ("Unable to reset system path field: \n" + e + '\n') ; 
     } 
     catch (IllegalAccessException e) 
     { 
      System.err.println ("Unable to access system path after reset: \n" 
        + e + '\n') ; 
     } */ 

     try 
     { 
      System.loadLibrary ("YourLibrary") ; 
     } 
     catch (UnsatisfiedLinkError e) 
     { 
      System.err.println ("Native code library failed to load.\n" + e) ; 
      System.exit (1) ; 
     } 

    } 

    public static void main (String[] args) 
    { 
     YourClass yc = new YourClass() ; 
     yc.print(); 
    } 
} 

Для приведенной выше коды библиотека DLL должна быть в той же папке, что и .java. Если вы работаете из командной строки, помните, что вы вызываете из того же каталога для javac и корневого каталога каталогов для вызова java. Таким образом, для .java будучи C: \ рабочее пространство \ yourpackage \ YourClass.java, вызовите из командной строки:

cd "C:\workspace" 
java yourpackage.YourClass 
2

Для правильного поиска библиотеки (из java.library.path) для различных ОС должна иметь разные названия:

  • Linux: libpsjw.so
  • Windows: psjw.dll

Чем вы можете позвонить из Java:

System.loadLibrary("psjw"); 
Смежные вопросы