1

我想使用 JPL 将 Java 和 Swi Prolog 连接在一起。当我在 Intellij 上将库添加到我的项目中时,编译的代码以及当我尝试运行查询时出现运行时错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no jpl in java.library.path: [C:\Program Files\Java\jdk-12\bin, C:\WINDOWS\Sun\Java\bin, C:\WINDOWS\system32, C:\WINDOWS, c:\swipl\bin, ${env_var:PATH}, .]
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2660)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:827)
at java.base/java.lang.System.loadLibrary(System.java:1902)
at org.jpl7.JPL.loadNativeLibrary(JPL.java:114)
at org.jpl7.fli.Prolog.<clinit>(Prolog.java:71)
at org.jpl7.Query.open(Query.java:369)
at org.jpl7.Term.textToTerm(Term.java:155)
at org.jpl7.Query.<init>(Query.java:169)
at Main.main(Main.java:7)

我有 swi prolog 64 位。

我试过卸载它并使用 32 位,但它不起作用。

到目前为止我做了什么:

我将 SWI_HOME_DIR 添加到我的环境变量中。我还将 swi 路径添加到 Path 变量中。我将 jpl 库添加到我的项目中(并且成功添加了它)。

我试图运行的代码:

import org.jpl7.*;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Query q = new Query("true");
        q.hasSolution();

        Map<String,Term>[] res = q.allSolutions();

        for (int i = 0; i < res.length; i++) {
            System.out.println(res[i]);
        }
    }
}
4

1 回答 1

1

因此,jpl.dll在任何列出的目录中:

C:\Program Files\Java\jdk-12\bin   ... probably not 
C:\WINDOWS\Sun\Java\bin            ... probably not
C:\WINDOWS\system32                ... probably not
C:\WINDOWS                         ... probably not
c:\swipl\bin                       ... apparently yes as c:\swipl\bin\jpl.dll exists?
${env_var:PATH}                    ... apparently not

在你的 Java 程序中尝试这个问题的建议:

File nativeFile = new File(filename + ".dll");
    if (!nativeFile.exists())
        System.exit(1);

System.load(nativeFile);

请注意,仅仅拥有jpl.jar是不够的。也需要jpl.dll文件。jpl.jar对 Java-Prolog 桥的 Java 部分有好处,但是为了能够调用非 JVM 编译,我们需要进入系统级细节,因此是 dll 文件。

在此处查看故障排除提示:JPL 为用户部署 - 在 Windows 上

从上面的页面:

如果 Java 示例抱怨

The dynamic link library libpl.dll could not be found in the specified path

或者

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\paul\bin\jpl.dll: Can't find dependent libraries

那么libpl.dll您的任何文件夹中 都没有 SWI-Prolog 库PATH:您应该有一个PATH条目,例如C:\Program Files\pl\bin.

应该包含 SWI-Prolog 本身的libpl.dll代码。

于 2020-09-11T18:29:52.660 回答