在java中加载一个c ++库.so会引发错误:undefined symbol:XOpenDisplay

时间:2017-05-24 08:26:55

标签: java c++ java-native-interface jna fedora-25

这个问题遵循one。我能够找到该库但是当它加载时会引发以下错误

java.lang.UnsatisfiedLinkError: /home/name/Documents/Development/GitLocalRepo/hidden-mathLibrary/hidden/lib/Distribution/libgtengine.so.3.7: /home/name/Documents/Development/GitLocalRepo/hidden-mathLibrary/hidden/lib/Distribution/libgtengine.so.3.7: undefined symbol: XOpenDisplay

引发错误的代码如下:

public class Frame {

    static {
        System.loadLibrary( "gtengine" );   // <- error occurs here
    }

    public interface libWrapper extends Library {

    libWrapper INSTANCE = (libWrapper)
            Native.loadLibrary(
                    "gtengine",
                    libWrapper.class );

    Pointer FrameCstructor(String name, long parent,
            double x, double y, double z,
            double rotX, double rotY, double rotZ,
            double vX, double vY, double vZ,
            double angVx, double angVy, double angVz,
            double accX, double accY, double accZ,
            double angAccX, double angAccY, double angAccZ,
            boolean addToFramelist);
    }

    public static native Pointer FrameCstructor(String name, long parent,
        double x, double y, double z,
        double rotX, double rotY, double rotZ,
        double vX, double vY, double vZ,
        double angVx, double angVy, double angVz,
        double accX, double accY, double accZ,
        double angAccX, double angAccY, double angAccZ,
        boolean addToFramelist);

    private Pointer ptrToCFrame;

    public Frame(String name, int parent,
        double x, double y, double z,
        double rotX, double rotY, double rotZ,
        double vX, double vY, double vZ,
        double angVx, double angVy, double angVz,
        double accX, double accY, double accZ,
        double angAccX, double angAccY, double angAccZ,
        boolean addToFramelist) {

    System.out.println("library: " + System.getProperty( "java.library.path" ));

    ptrToCFrame = libWrapper.INSTANCE.FrameCstructor( name, parent,
            x, y, z, rotX, rotY, rotZ,
            vX, vY, vZ, angVx, angVy, angVz,
            accX, accY, accZ, angAccX, angAccY, angAccZ,
            addToFramelist );
    }
}

是否由于库中存在一些对X11的引用?将它从图书馆中删除将是一项巨大的工作!我正在使用fedora 25。

由于

2 个答案:

答案 0 :(得分:2)

正如您所见,here gtengine使用X11库。在您的情况下,哪个看起来缺失。 XOpenDisplay函数位于xlib库中。

答案 1 :(得分:1)

看看这里:

https://github.com/mkowsiak/jnicookbook/blob/master/recipeNo023/Makefile

在此示例代码中,您可以看到如何处理需要其他代码才能工作的JNI代码。

请确保该库带有&#34; XOpenDisplay&#34; (xlib - 正如sathereal已经提到的)对JVM是可见的(例如,在构建JNI代码时将其添加到LD_LIBRARY_PATH或用户-Wl,-rpath)。

与JNI玩得开心。