Неудовлетворенная ошибка связи при использовании System.loadLibrary ()? - PullRequest
8 голосов
/ 18 июня 2010

По какой-то причине я получаю досадную ошибку неудовлетворенной связи в своем java-приложении.

Это преступник, о котором идет речь:

System.loadLibrary("psjw");

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

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

Ответы [ 5 ]

4 голосов
/ 18 июня 2010

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

Пример: 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);
    }
}
3 голосов
/ 18 июня 2010

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

2 голосов
/ 14 июня 2016

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

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

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

System.loadLibrary( "psjw" );
0 голосов
/ 22 октября 2013

Я работал над этой же проблемой в течение двух дней, но в конце концов нашел ответ.Сначала я создал каталог для библиотек и установил переменную среды 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: \ workspace \ yourpackage \ YourClass.java, вы вызываете из командной строки:

cd "C:\workspace"
java yourpackage.YourClass
0 голосов
/ 24 мая 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...