JPL Не удается найти зависимые библиотеки jpl.dll

После установки SWI-Prolog на свой компьютер я попробовал один из его примеров и обнаружил вот такую ​​красоту:

run:
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Program Files (x86)\swipl\bin\jpl.dll: Can't find dependent libraries
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1807)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1732)
    at java.lang.Runtime.loadLibrary0(Runtime.java:823)
    at java.lang.System.loadLibrary(System.java:1028)
    at jpl.JPL.loadNativeLibrary(JPL.java:100)
    at jpl.fli.Prolog.<clinit>(Prolog.java:85)
    at jpl.Query.open(Query.java:286)
    at jpl.Util.textToTerm(Util.java:162)
    at jpl.Query.<init>(Query.java:198)
    at main.ProjetoPLP.main(ProjetoPLP.java:12)
Java Result: 1

Я проверил, и в вышеупомянутой папке есть файл jpl.dll, поэтому я не совсем уверен, что здесь происходит. Я проверил старые вопросы на этом веб-сайте и в Интернете, но ни один из них не дал окончательного ответа.

Кто-нибудь знает, как это сделать?

РЕДАКТИРОВАТЬ:

Вот код, который я пытаюсь запустить, если это поможет.

package main;
import java.io.*;
import java.util.Hashtable;
import jpl.Query;
import org.apache.commons.io.*;

public class ProjetoPLP
{

    private static void loadJPLDll() {
    try {
        InputStream in = ProjetoPLP.class.getResourceAsStream("/test/resources/jpl.dll");
        File fileOut = new File("jpl.dll");
        OutputStream out = FileUtils.openOutputStream(fileOut);
        IOUtils.copy(in, out);
        in.close();
        out.close();
        System.load(fileOut.getAbsolutePath());// loading goes here
    } catch (Exception e) {
        e.printStackTrace();
    }
}
    public static void
    main(String args[] )
    {

                loadJPLDll();
        String t1 = "consult('family.pl')";
        Query q1 = new Query(t1);

        System.out.println( t1 + " " + (q1.hasSolution() ? "succeeded" : "failed") );

        //--------------------------------------------------

        String t2 = "child_of(joe, ralf)";
        Query q2 = new Query(t2);

        System.out.println( t2 + " is " + (q2.hasSolution() ? "provable" : "not provable") );

        //--------------------------------------------------

        String t3 = "descendent_of(steve, ralf)";
        Query q3 = new Query(t3);

        System.out.println( t3 + " is " +(q3.hasSolution() ? "provable" : "not provable") );

        //--------------------------------------------------

        String t4 = "descendent_of(X, ralf)";
        Query q4 = new Query(t4);

        System.out.println( "first solution of " + t4 + ": X = " + q4.oneSolution().get("X"));

        //--------------------------------------------------

        Hashtable[] ss4 = q4.allSolutions();

        System.out.println( "all solutions of " + t4);
        for ( int i=0 ; i<ss4.length ; i++ ) {
            System.out.println( "X = " + ss4[i].get("X"));
        }

        //--------------------------------------------------

        System.out.println( "each solution of " + t4);
        while ( q4.hasMoreSolutions() ){
            java.util.Hashtable s4 = q4.nextSolution();
            System.out.println( "X = " + s4.get("X"));
        }

        //--------------------------------------------------

        String t5 = "descendent_of(X,Y)";
        Query q5 = new Query(t5);

        System.out.println( "each solution of " + t5 );
        while ( q5.hasMoreSolutions() ){
            java.util.Hashtable s5 = q5.nextSolution();
            System.out.println( "X = " + s5.get("X") + ", Y = " + s5.get("Y"));
        }

    }

}

person user2444503    schedule 04.06.2013    source источник
comment
У вас есть исходный код?   -  person Makky    schedule 04.06.2013
comment
Я получаю одно и то же исключение во всех примерах, поэтому я не думал, что это необходимо. Должен ли я все еще включать его?   -  person user2444503    schedule 04.06.2013


Ответы (2)


Просто для информации, если у вас есть банка, то это не сработает.

 System.load("xxx.dll"); won't work inside the jar file.

Потребуется физический файл.

Что вы можете сделать, это:

Создайте пакет как "test.resources" и поместите в него свой "jpl.dll".

Теперь внутри вашего основного метода вы можете загрузить DLL как

private static void loadJPLDll() {
    try {
        InputStream in = YourCLASS.class.getResourceAsStream("/test/resources/jpl.dll");
        File fileOut = new File("jpl.dll");
        OutputStream out = FileUtils.openOutputStream(fileOut);
        IOUtils.copy(in, out);
        in.close();
        out.close();
        System.load(fileOut.getAbsolutePath());// loading goes here
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Помните, что для выполнения этой работы вам понадобится jar commons-io.

person Makky    schedule 04.06.2013
comment
Я не понимаю одну (или, возможно, несколько) вещей, зачем использовать «Файл fileOut = новый файл (имя);»? Или, лучше, что должно быть в этом имени? 'jpl.dll' или что-то совсем другое? - person user2444503; 04.06.2013
comment
Я пробовал это, и, похоже, это не работает для меня, так как я получаю то же исключение. И да, у меня есть Apache Commons-io. - person user2444503; 04.06.2013
comment
Я добавил исходный код того, что я пытаюсь сделать в исходном сообщении. Я более чем немного потерян в этой ситуации, так как я не делал ничего подобного в прошлом. - person user2444503; 05.06.2013
comment
Я попробовал сам, я думаю, вы закончите добавлять довольно много других файлов dll, так как jpl.dll зависит от них. - person Makky; 05.06.2013
comment
Итак, я должен запустить приложение, которое узнает, какие зависимости есть у .dll, и вручную добавить их в мои папки? Я посмотрю на это... - person user2444503; 05.06.2013
comment
Не помогло, прошу прощения. Позже я обнаружил, что jpl.dll немного ошибочна и требует вставки множества других .dll в путь Java. Я скоро напишу исчерпывающий ответ на этот вопрос. - person user2444503; 14.06.2013

Для Windows измените настройки пути среды и добавьте C:\Program Files (x86)\swipl\bin, если у вас установлен swi-prolog в этом месте. В качестве альтернативы можно загрузить файлы DLL, как показано ниже.

private static void loadDLL(String location) {
    try {
        File dll = new File(location);
        System.load(dll.getAbsolutePath());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    //load the dependent dll files
    loadDLL("libwinpthread-1.dll");
    loadDLL("libgcc_s_sjlj-1.dll");
    loadDLL("libgmp-10.dll");
    loadDLL("libswipl.dll");    
    loadDLL("json.dll");
    loadDLL("jpl.dll");

    //your code here
}

Вам нужно будет добавить местоположение собственной библиотеки для прикрепленного файла JPL.jar, если вы используете приведенный выше код. Вы можете следовать Как установить java.library.path из Eclipse

person Odessy    schedule 24.10.2015