在我的计算机中安装SWI之后,我继续尝试它的一个示例,并发现了这个特殊的优点:
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"));
}
}
}发布于 2013-06-04 08:43:21
只要你知道,如果你有一个罐子,那么它是行不通的。
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。
发布于 2015-10-24 16:12:25
对于windows,更改环境路径设置,如果在该位置安装了swipl,则添加C:\Program (x86)\swipl\bin。或者,可以按如下所示加载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文件添加本机库位置。你可以跟着How to set the java.library.path from Eclipse
https://stackoverflow.com/questions/16913232
复制相似问题