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

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.(Sys.java:112) at org.lwjgl.opengl.Display.(Display.java:135) at org.lorana.client.Lorana.(Lorana.java:20) at org.lorana.client.Lorana.main(Lorana.java:31) 

我将所有本机库链接到每个引用的库后,错误仍然存​​在,并遵循http://ninjacave.com/lwjglwitheclipse的说明

我也跟随董事会关于lwjgl不满意的链接错误的其他问题,但无济于事。

非常感谢帮助,提前谢谢!

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()); 

不确定它是否在Eclipse中工作但是我在尝试构建可执行JAR时遇到了类似的问题。

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

正如@Dawnkeeper 所描述的 ,您可以简单地使用“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://stackoverflow.com/q/5419039 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