LWJGL 'java.lang.UnsatisfiedLinkError': java.library.path中没有lwjgl。

5
Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.libr
ary.path
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.loadLibrary0(Unknown Source)
        at java.lang.System.loadLibrary(Unknown Source)
        at org.lwjgl.Sys$1.run(Sys.java:73)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.lwjgl.Sys.doLoadLibrary(Sys.java:66)
        at org.lwjgl.Sys.loadLibrary(Sys.java:95)
        at org.lwjgl.Sys.<clinit>(Sys.java:112)
        at org.lwjgl.opengl.Display.<clinit>(Display.java:135)
        at org.lorana.client.Lorana.<init>(Lorana.java:20)
        at org.lorana.client.Lorana.main(Lorana.java:31)

我已经将所有本地库链接到每个引用库,并按照http://ninjacave.com/lwjglwitheclipse的说明进行了操作,但错误仍然存在。
我还遵循了论坛上关于lwjgl unsatisfiedlinkerrors的其他问题,但没有任何效果。
非常感谢您的帮助,提前致谢!

这个错误意味着JVM找不到本地库lwjgl.dll,因此一些配置可能出了问题。如果没有更多关于项目配置的信息,很难给你一个更有用的答案。 - Jesper
2个回答

5
LWJGL 使用自己的变量来指向原生库的路径:
 System.setProperty("org.lwjgl.librarypath", new File("pathToNatives").getAbsolutePath());

如果您保留了LWJGL包的文件结构,可以使用以下方式:
    switch(LWJGLUtil.getPlatform())
    {
        case LWJGLUtil.PLATFORM_WINDOWS:
        {
            JGLLib = new File("./native/windows/");
        }
        break;

        case LWJGLUtil.PLATFORM_LINUX:
        {
            JGLLib = new File("./native/linux/");
        }
        break;

        case LWJGLUtil.PLATFORM_MACOSX:
        {
            JGLLib = new File("./native/macosx/");
        }
        break;
    }

    System.setProperty("org.lwjgl.librarypath", JGLLib.getAbsolutePath());

我需要在主可运行的jar文件中的一个子文件夹中拥有本地文件吗? - firt
属性必须设置为本地库的完整路径。只要路径匹配,它们在哪里并不重要。第二个代码片段是为一个结构构建的,其中库位于主jar旁边的路径中,并且仍然使用LWJGL包中的子文件夹。 - Dawnkeeper
非常感谢!我通过使用setProperty方法将其指向/natives/windows,成功让它工作了。该方法在导出的jar文件所在目录中查找文件。 - firt

0

不确定如何在Eclipse中使其工作,但我在尝试构建可执行JAR时遇到了类似的问题。

以下所有解决方案都假定您将本机库与JAR文件放在同一目录中,或将其作为嵌入式资源捆绑到JAR中。

正如@Dawnkeeper所描述的那样describes,您可以简单地使用“org.lwjgl.librarypath”系统属性来指示LWJGL查找本机库的位置。

或者

正如您的错误提示所示,LWJGL检查更常见的“java.library.path”系统属性以定位本机库。您可以在运行JAR时通过命令行设置它,如下所示:

java -Djava.library.path=./lib -jar myApplication.jar

正如我之前提到的,我想要一个独立的可执行JAR文件;我不希望用户必须使用命令行参数来运行JAR文件。我试图从我的main方法中设置这个系统属性,但很快发现在JVM运行时初始化后,您无法更改此系统属性的值。相反,我最终编写了以下代码(使用上面链接的解决方法)来在我的main方法中设置"java.library.path":

public static void main(String[] args) {
    addLwjglNativesToJavaLibraryPathProperty();
    // run code dependent on LWJGL here...
}

private static void addLwjglNativesToJavaLibraryPathProperty() {
    String osDir;
    if (SystemUtils.IS_OS_WINDOWS) {
        osDir = "windows";
    } else if (SystemUtils.IS_OS_LINUX) {
        osDir = "linux";
    } else if (SystemUtils.IS_OS_MAC_OSX) {
        osDir = "macosx";
    } else if (SystemUtils.IS_OS_SOLARIS) {
        osDir = "solaris";
    } else {
        throw new RuntimeException("Unsupported OS: " + System.getProperty("os.name"));
    }
    addPathToJavaLibraryPathProperty("lib/natives/" + osDir);
}

// https://dev59.com/-m035IYBdhLWcg3wcviS
private static void addPathToJavaLibraryPathProperty(String propertyValue) {
    String propertyName = "java.library.path";
    try {
        Field field = ClassLoader.class.getDeclaredField("usr_paths");
        field.setAccessible(true);
        String[] paths = (String[]) field.get(null);
        for (String path : paths) {
            if (propertyValue.equals(path)) return;
        }
        String[] tmp = new String[paths.length + 1];
        System.arraycopy(paths, 0, tmp, 0, paths.length);
        tmp[paths.length] = propertyValue;
        field.set(null, tmp);
        System.setProperty(propertyName, System.getProperty(propertyName) + File.pathSeparator + propertyValue);
    } catch (IllegalAccessException e) {
        throw new RuntimeException("Failed to get permissions to set " + propertyName);
    } catch (NoSuchFieldException e) {
        throw new RuntimeException("Failed to get field handle to set " + propertyName);
    }
}

代码参考:https://code.google.com/p/gwahtzee/source/browse/trunk/src/main/java/com/googlecode/gwahtzee/Application.java

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接