loading a c++ library.so in java raises the error: undefined symbol: XOpenDisplay

loading a c++ library.so in java raises the error: undefined symbol: XOpenDisplay

这个问题跟在这个之后。我能够找到该库,但在加载时会引发以下错误

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 的引用?将其从库中删除将是一项艰巨的工作!我正在使用软呢帽 25。

谢谢

如您所见here gtengine 使用 X11 库。哪一个,在你的情况下,看起来不见了。 XOpenDisplay 函数在 xlib 库中。

看这里:

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

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

只需确保带有 "XOpenDisplay" 的库(xlib - 正如 sithereal 已经提到的)对 JVM 可见(例如,在构建 JNI 时将其添加到 LD_LIBRARY_PATH 或用户 -Wl,-rpath代码)。

玩得开心 JNI。