JPL Cannot find jpl.dll dependent libraries

After installing SWI-Prolog on my computer, I continued to use one of my examples and recognized this particular beauty:

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 

I checked and there is a jpl.dll file inside the above folder, so I'm not quite sure what is going on here. I checked old questions on this website and on the Internet, but none of them gave any convincing answer.

Does anyone know how to do this?

EDIT:

Here is the code I'm trying to run in case this helps.

 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")); } } } 
0
source share
2 answers

Just for your information, if you have a bank, then this will not work.

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

This will require a physical file.

What can you do:

Create the package as "test.resources" and put "jpl.dll" in it.

Now inside the main method you can load the DLL as

 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(); } } 

Remember to do this work, you will need commons-io jar.

0
source

For windows, change the environment path settings and add C: \ Program Files (x86) \ swipl \ bin if a swi prolog is installed in this place. Alternatively, dll files can be downloaded as shown below.

 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 } 

When using the above code, you will need to add a local library for the attached JPL.jar file. You can follow How to install java.library.path from Eclipse

0
source

Source: https://habr.com/ru/post/1262606/


All Articles