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.URLClassLoader1.run(URLClassLoader.java:361)atjava.security.AccessController.doPrivileged(NativeMethod)atjava.net.URLClassLoader.findClass(URLClassLoader.java:360)atjava.lang.ClassLoader.loadClass(ClassLoader.java:424)atsun.misc.Launcher1.run(URLClassLoader.java:361) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:360) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.LauncherAppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 2 more

    Programm 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 muss

    java -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.


Anmelden zum Antworten