LWJGL Probleme native
-
Hallo,
ich habe seit kurzem angefangen, Java zu programmieren und habe in LWJGL (wahrscheinlich ein einfaches) Problem.
Der folgende Code kompiliert einwandfrei. Wenn man diesen allerdings ausführt, dann bekomme ich ein Haufen Fehler. Ich denke, es hat irgendetwas mit dem Linken zu tun.Test.java
//- Importe -// import org.lwjgl.LWJGLException; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; import org.lwjgl.opengl.GL11; //- Klassen -// class Test{ //- Methoden -// public static void main(String[ ]arg){ //-- Variablendeklaration und -initialisierung --// //-- Code --// try{ Display.setDisplayMode(new DisplayMode(800,800)); Display.create(); }catch(LWJGLException e){ e.printStackTrace(); System.exit(1); }; while((Display.isCloseRequested()==false)){ Display.update(); }; Display.destroy(); return; }; //- Variablen -// };
Kompiliert wird der Code mit folgendem Befehl:
javac -classpath ".;.\libraries\*" Test.java
Anschließend wird eine jar erstellt:
jar 0cfmv Test.jar MANIFEST.mf *.class
Und letztendlich wird der Code ausgeführt:
java -jar Test.jar -Djava.library.path=".\libraries\native"
Beim Ausführen bekomme ich ein Konsolenfenster mit folgendem Fehler-Code:
Exception in thread "main" java.lang.NoClassDefFoundError: org/lwjgl/LWJGLException at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Unknown Source) at java.lang.Class.getMethod0(Unknown Source) at java.lang.Class.getMethod(Unknown Source) at sun.launcher.LauncherHelper.validateMainClass(Unknown Source) at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) Caused by: java.lang.ClassNotFoundException: org.lwjgl.LWJGLException at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 6 more
Die Ordnerstruktur sieht wie folgt aus:
Test: - MANIFEST.mf - Test.class - Test.jar - Test.java - resources: -- (leer) - libraries: -- AppleJavaExtensions.jar -- asm-debug-all.jar -- jinput.jar -- lwjgl.jar -- lwjgl_test.jar -- lwjgl_util.jar -- lwjgl_util_applet.jar -- lwjgl-debug.jar -- lzma.jar -- native: --- jinput-dx8.dll --- jinput-dx8_64.dll --- jinput-raw.dll --- jinput-raw_64.dll --- lwjgl.dll --- lwjgl64.dll --- OpenAL32.dll --- OpenAL64.dll
Was mache ich falsch?
MfG
Seikuassi
-
AFAIK musst du beim Ausführeren auch noch den Pfad zu den libs angeben:
java -jar Test.jar -cp libraries/* -Djava.library.path=".\libraries\native"
Oder so ähnlich.
-
Hallo DarkShadow44,
hat leider nicht so ganz funktioniert.
Meine Ordnerstruktur sieht jetzt wie folgt aus:
Test -MANIFEST.mf -start.bat -Test.java -Test.jar -libraries --native ---freebsd ----(leer) ---Linux ----libjinput-linux.so ----libjinput-linux64.so ----liblwjgl.so ----liblwjgl64.so ----libopenal.so ----libopenal64.so ---macosx ----libjinput-osx.jnilib ----liblwjgl.jnilib ----openal.dylib ---solaris ----liblwjgl.so ----liblwjgl64.so ----libopenal.so ----libopenal64.so ---windows ----jinput-dx8.dll ----jinput-dx8_64.dll ----jinput-raw.dll ----jinput-raw_64.dll ----lwjgl.dll ----lwjgl64.dll ----OpenAL32.dll ----OpenAL64.dll --AppleJavaExtensions.jar --asm-debug-all.jar --jinput.jar --lwjgl-debug.jar --lwjgl.jar --lwjgl_test.jar --lwjgl_util.jar --lwjgl_util_applet.jar --lzma.jar -resources --(leer)
Test.java
package classes; import java.io.*; import java.util.Properties; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; // --- Klassen --- // class Game_Window{ // --- Methoden --- // private void draw(){ return; }; public void start(int height,int width){ try{ Display.setDisplayMode(new DisplayMode(height,width)); Display.create(); }catch(Exception e){ System.exit(1); }; init(); while((Display.isCloseRequested()==false)){ draw(); Display.update(); }; Display.destroy(); }; public void init(){ return; }; // --- Variablen --- // // --- Aufzählungen --- // }; class Test{ // --- Methoden --- // public static void main(String[]arg){ Game_Window gW=new Game_Window(); gW.start(800,600); return; }; // --- Variablen --- // // --- Aufzählungen --- // };
MANIFEST.mf
Manifest-Version: 1.0 Created-By: PHBU Main-Class: classes.Test Class-Path: .;libraries\*
compile.bat
cmd /c echo --- temporaeres Verzeichnis erstellen --- cmd /c md "$(CURRENT_DIRECTORY)\classes" cmd /c echo. cmd /c echo --- .java-Datei(en) kompilieren --- javac -cp .;libraries\* -d classes\ *.java cmd /c echo. cmd /c echo --- .class-Datei(en) packen --- jar -0cfmv $(NAME_PART).jar MANIFEST.mf resources -C classes\ . cmd /c echo. cmd /c echo --- temporaeres Verzeichnis löschen --- cmd /c rd "$(CURRENT_DIRECTORY)\classes" /S /Q
Rückgabe von compile.bat
--- temporaeres Verzeichnis erstellen ---
--- .java-Datei(en) kompilieren ---
--- .class-Datei(en) packen ---
Manifest wurde hinzugef³gt
resources/ wird hinzugef³gt(ein = 0) (aus = 0)(0 % gespeichert)
classes/ wird hinzugef³gt(ein = 0) (aus = 0)(0 % gespeichert)
classes/Game_Window.class wird hinzugef³gt(ein = 793) (aus = 793)(0 % gespeichert)
classes/Test.class wird hinzugef³gt(ein = 343) (aus = 343)(0 % gespeichert)--- temporaeres Verzeichnis löschen ---
start.bat
@echo off java -cp .;.\libraries\* -jar Test.jar -Djava.path.library=.\libraries\native\windows echo. echo. echo. echo Programm beendet. Druecken Sie eine beliebige Taste, um das Programm zu beenden. pause>NUL exit
Ich bekomme folgenden Fehlercode im Konsolenfenster des Programms zurück, wenn ich start.bat starte:
Exception in thread "main" java.lang.NoClassDefFoundError: org/lwjgl/opengl/DisplayMode
at classes.Game_Window.start(Test.java:16)
at classes.Test.main(Test.java:40)
Caused by: java.lang.ClassNotFoundException: org.lwjgl.opengl.DisplayMode
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoaderAppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 2 moreProgramm beendet. Druecken Sie eine beliebige Taste, um das Programm zu beenden.
Nochmal: Wo liegt der Fehler?
MfG
Seikuassi
-
In MANIFEST.MF
Class-Path: .;libraries\*
Du verwendest Wildcarts, darf man aber in der MANIFEST.MF nicht - habs ausprobiert.
Trennzeichen im Manifest ist im Übrigen das Lerrzeichen! Außerdem brauchst du "." nicht im Classpath.In deiner Start.bat
java -cp .;.\libraries\* -jar Test.jar -Djava.path.library=.\libraries\native\windows
Warum gibst du den Classpath nochmal an ? Einmal reicht.
Außerdem - ganz wichtig, es mussjava -cp .;.\libraries\* -Djava.path.library=.\libraries\native\windows -jar Test.jar
heißen, sonst findet der die natives zu lwjgl nicht. Frag mich nicht warum, ist einfach so.