【问题标题】:Using GraphVIZ Native library from Java使用 Java 中的 GraphVIZ Native 库
【发布时间】:2016-08-08 03:46:08
【问题描述】:

我正在尝试使用 java 中的 graphviz 本机库。我能够在 Eclipse 中编译该程序。但是遇到异常:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no gv in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
    at java.lang.Runtime.loadLibrary0(Runtime.java:840)
    at java.lang.System.loadLibrary(System.java:1047)
    at org.graphviz.test.Test.<clinit>(Test.java:12)
Could not find the main class: org.graphviz.test.Test. Program will exit.

这是我的代码(当然是从某处复制的):

package org.graphviz.test;

import org.graphviz.internal.SWIGTYPE_p_Agedge_t;
import org.graphviz.internal.SWIGTYPE_p_Agnode_t;
import org.graphviz.internal.SWIGTYPE_p_Agraph_t;
import org.graphviz.internal.gv;

    public class Test {
        static {
            System.loadLibrary("gv");
        }

        public static void main(String[] args) {
        SWIGTYPE_p_Agraph_t g, sg;
        SWIGTYPE_p_Agnode_t n, m;
        SWIGTYPE_p_Agedge_t e;

        g = gv.digraph("G");
        System.out.println(gv.setv(g,"aaa","xxx"));
        System.out.println(gv.getv(g,"aaa"));
        sg = gv.graph(g,"SG");
        n = gv.node(g,"hello");
        System.out.println(gv.getv(n,"label"));
        System.out.println(gv.setv(n,"aaa","xxx"));
        System.out.println(gv.getv(n,"aaa"));
        m = gv.node(g,"world");
            System.out.println(gv.getv(m,"aaa"));
        e = gv.edge(n,m);
        System.out.println(gv.setv(e,"aaa","xxx"));
            System.out.println(gv.getv(e,"aaa"));
        gv.rm(e);
        gv.rm(n);
        gv.rm(m);
        gv.rm(g);

        g = gv.readstring("digraph G {a->b}");
        gv.rm(g);

        g = gv.read("hello.gv");
        gv.layout(g,"dot");
        gv.render(g,"png","hello.png");
        gv.rm(g);
        }
        }

我已正确指向库,但在运行时出现 UnsatisfiedLinkError。有人试过使用 graphviz 原生库吗?请告诉我如何配置 JNI。

【问题讨论】:

  • 有人有graphviz-java debian包吗?请分享。

标签: java graphviz java-native-interface


【解决方案1】:

我相信您的问题是您尝试从 gv 导入,但您没有指定要导入的内容。这有点像如果你只是写——

import org.graphviz.internal;

请尝试从 gv 库中导入特定库。例如,如果你想要一个有向图,你可能会做这样的事情---

import org.graphviz.internal.gv.digraph;

看看下面的文档,看看它是否有帮助。它可能会让您更好地了解 gv 的来源以及如何导入与其关联的方法。

http://www.graphviz.org/pdf/gv.3java.pdf

【讨论】:

    【解决方案2】:

    获取 graphviz-java

    确保您已安装 graphviz-java。对于 MacPorts,这应该像这样工作:

    sudo port install graphviz +java
    

    这对我来说实际上在第一次尝试时失败并抱怨 swig-java,这解决了它:

    sudo port install swig-java
    sudo port install graphviz +java
    

    现在我的库安装在/opt/local/lib/graphviz/java 下,如果找不到,请搜索libgv.jnilib

    设置类路径

    我在 Eclipse 中编译,为此我将 /opt/local/lib/graphviz/java 作为外部类文件夹添加到构建路径中。

    编译

    这是一个编写图像的简单示例。请注意,System.loadLibrary("gv") 必须在调用 graphviz 中的任何内容之前发生。

    import org.graphviz.SWIGTYPE_p_Agedge_t;
    import org.graphviz.SWIGTYPE_p_Agnode_t;
    import org.graphviz.SWIGTYPE_p_Agraph_t;
    import org.graphviz.gv;
    
    public class Main {
    
        static {
            System.loadLibrary("gv");
        }
    
        public static void main(String[] args) {
            SWIGTYPE_p_Agraph_t g = gv.digraph("G");
            SWIGTYPE_p_Agnode_t n = gv.node(g, "hello");
            SWIGTYPE_p_Agnode_t m = gv.node(g, "world");
            SWIGTYPE_p_Agedge_t e = gv.edge(n, m);
            gv.layout(g, "dot");
            gv.render(g, "png", "hello.png");
        }
    
    }
    

    运行

    使用java.library.path=/opt/local/lib/graphviz/java 运行,例如-Djava.library.path=/opt/local/lib/graphviz/java 作为 Eclipse 运行配置中的 VM 参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-08
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      相关资源
      最近更新 更多