不确定如何在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();
}
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);
}
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
lwjgl.dll
,因此一些配置可能出了问题。如果没有更多关于项目配置的信息,很难给你一个更有用的答案。 - Jesper