# Java3D als Applet ohne Installation von Java3d



## krel (21. Dez 2011)

Hallo zusammen,

jetzt kommen ich noch mit einer weiteren Frage zu euch. Wie kann ich meine Anwendung so verpacken, sodass sie auch ohne eine Installation von Java3d läuft. Irgendwo muss ich ja die 3 DLLs unterbringen. Aber nach vielem suchen habe ich noch nichts hilfreiches gefunden. Hat jemand einen Tipp?

Gruß


----------



## irgendjemand (21. Dez 2011)

ich glaube das wird nichts aus dem einfachen grund das java nur physisch auf der platte existierende lib-files wie DLL oder SO einbinden kann *hat was mit dem zu grunde liegenden c/c++ loader-code zu tun* ...

und eine lib "zu installieren" ist so auch nicht ganz korrekt ... mann muss lediglich bei start einer app sicherstellen das die nötigen parameter gesetzt sind um die libs zu finden ...


----------



## krel (29. Dez 2011)

Hi,

eigentlich sollte es ja mit nem signierten Applet funktionieren, da ich dann ja auf das Dateisystem zugreifen kann und auch Datei speichern kann. Das ist aber ein anderes Problem.

Ich habe meine Simulation jetzt erstmal in einen JFrame gepackt und will es direkt als jar auf dem System starten.
Derzeit versuche ich die DLLs einfach aus dem JAR zu extrahieren und beim Start der jar mittels 
	
	
	
	





```
java -jar Magnetsimu.jar -Djava.library.path="${java.io.tmpdir}magnet
```
 den library path zu setzen. Die Ausgabe von 
	
	
	
	





```
System.out.println(System.getProperty("java.libray.path")
```
 liefert aber immer das gleiche und der Start scheitert natürlich. Woran kann es liegen, dass das einfach irgnoriert wird?

Gruß


----------



## irgendjemand (29. Dez 2011)

also wenn du das als runnable jar ausliefern willst kannst du dir das auch einfacher machen in dem du wie schon beschrieben die daten zum start temp exportierst und dann mit System.load(String) erst während der laufzeit nachlädst ... *sollte natürlich gesehen bevor klassen mit native-code instanziert werden* ...

wäre im übrigen auch der weg für ein signiertes applet


----------



## krel (1. Jan 2012)

leider scheint java3d die Libs nochmals direkt laden zu wollen, denn ich bekomme trotz dessen, dass ich die Library vorher geladen habe folgende Fehlermeldung:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no j3dcore-ogl in java.library.path

jemand ne Idee dazu? Bzw. wie muss ich denn beim starten den library path setzen


----------



## truesoul (2. Jan 2012)

Also mit j3dcore-ogl wird die DLL Datei gemeint. Also heißt es: 
Java ist auch eine Insel – 24.2 Einbinden einer C-Funktion in ein Java-Programm 
Eclipse, Java3d, and java.library.path  filsa.net

Die musst du zustätzlich laden (siehe Links).


----------



## krel (2. Jan 2012)

Hi,

was mit dem Fehler gemeint ist, ist mir schon klar. Mein Ziel ist es für Windows 32bit und 64bit die gleiche Jar zu verwenden, die entsprechend des Systems die entsprechenden DLLs irgendwo (am bestens ins Temp-Verzeichnis) entpackt und ich das Programm ohne Installation von Java3D benutzen kann.
Folgender Code extrahiert die DLLs aus der Jar und speichert sie im Temp Verzeichnis und lädt anschließend die Library. Hierbei gibt es auch keinerlei Fehler.
[JAVA=75]
private void extractDLL(String pkg, String[] files) {
        String tmp = System.getProperty("java.io.tmpdir");
        tmp += (tmp.endsWith(File.separator)) ? "magnet" : File.separator + "magnet";
        byte[] buffer = new byte[1024];

        if (!new File(tmp).exists()) {
            new File(tmp).mkdirs();
        }

        for (String file : files) {
            try {
                InputStream in = getClass().getResourceAsStream(pkg + file);
                OutputStream out = new FileOutputStream(tmp + File.separator + file);
                while (in.read(buffer) != -1) {
                    out.write(buffer);
                }
                out.close();
                in.close();
            } catch (FileNotFoundException ex) {
                Logger.getLogger(Magnetsimu.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(Magnetsimu.class.getName()).log(Level.SEVERE, null, ex);
            }
            //m System.out.println(tmp + File.separator + file);
            System.load(tmp + File.separator + file);
        }
    }
[/code]
Nun ist es aber scheinbar so, dass Java3D beim ersten Aufruf auch nochmal versucht die Libraries zu laden aber scheinbar mit 
	
	
	
	





```
System.loadLibrary(...)
```
 denn es kommt die bereits gepostete Fehlermeldung auf. 
Die Frage ist, mach ich was falsch oder liegt es an Java3D?


----------

