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?
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 ...
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
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
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
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
Code:
System.loadLibrary(...)
denn es kommt die bereits gepostete Fehlermeldung auf.
Die Frage ist, mach ich was falsch oder liegt es an Java3D?