# java3D über Webstart



## Ulmerschwabe (16. Apr 2007)

Hallo alle zusammen...

Momentan habe ich mir als Ziel gesteckt, eine WebStart-Applikation zu schreiben, in der ein 3D-Szenengraph steckt. Nun sollte es natürlich so funktionieren, dass man die Applikation nur anklicken muss und dann läuft das ganze.

Dazu habe ich die jar-Dateien vecmath.jar, j3dcore.jar und j3dutils.jar in die auszuführende jar-Datein mit reingepackt, damit der Pfad zu oben genannten Packeten mittels import gefunden werden. Nun fehlen natülich für WinXP die *.dll und  für Linux die *.so dazu, die bei der Installation von Java3d mitgebracht werden. Ich möchte allerdings, dass man die Applikation ohne Installation laufen lassen kann. Ist das überhaupt möglich und wenn ja, wie stelle ich das an???

Gruß Marco


----------



## Ulmerschwabe (17. Apr 2007)

Ist es evtl. möglich den java.library.path wärend der Laufzeit zu setzen? Damit wäre wäre mein obiges Problem evtl. lösbar.

Habe versucht native zu programmieren. Dabei versuchte ich das Standard helloWorld aus und erstellte somit die libhello.so unter Ubuntu. Wenn ich nun die Hello.class ausführen will, kommt folgender Fehler:


```
no hello in java.library.path
```

Nun kann man dieses Problem beim Programmaufruf mit -Djava.library.path=./ umgehen

Dann habe ich versucht, denn Pfad wärend der Laufzeit zu ändern mittels:

```
String url = System.getProperty("java.library.path") + ":/home/marco-hartich/workspace/TestJavaNative";
System.setProperty("java.library.path", url);
```

Ein einfacher Programmaufruf mit java -classpath Hello ergibt jedoch wiedermal obige Fehlermeldung.

Leider ergab das nicht das erwünschte Ergebnis und es kommt wieder obige Fehlermeldung.

Hat jemand eine Idee, wie man den java.library.path zur Laufzeit im JavaProgramm ändern kann??

Damit könnte ich evtl. die *.dll und *.so von dem jar aus einbinden

Gruß Marco[/code]


----------



## Wildcard (17. Apr 2007)

Dafür gibt's das nativlib Element:
http://java.sun.com/j2se/1.5.0/docs/guide/javaws/developersguide/syntax.html#resources


----------



## Ulmerschwabe (17. Apr 2007)

Danke für die Antwort... Werde es testen

Ist es dennoch prinzipiell möglich, in einer Java-Applikation den Pfad zur Laufzeit zu ändern? Wäre eine sehr hilfreiche Funktionalität...


----------



## Wildcard (17. Apr 2007)

Braucht man nicht, es gibt System.load


----------



## Ulmerschwabe (17. Apr 2007)

Ja genau, das ist genau das, was ich gesucht habe; und dabei lag's ständig vor der Nase

Danke, dann kann ich heute beruhigt ins Bett gehen...

Gruß Marco


----------



## Ulmerschwabe (18. Apr 2007)

Das Drama geht weiter 

Also der Tipp mit dem System.load war echt gut, damit kann ich schonmal meine eigenen Bibliotheken einbinden. Aber mit den 3dXXX Bibliotheken schaut das anders aus.

Kann ich die 3dXXX Bibliotheken nicht einfach in das Jar-File packen und dann im Manifest dann darauf verweisen?? Habe es schon so versucht:

```
Manifest-Version: 1.0
Class-Path: j3dcore-ogl.dll j3dcore-d3d.dll j3dcore-ogl-cg.dll
Main-Class: robotGUI.GuiMain
Leerzeile
```

Die findet er aber nicht.
Wie binde ich die am besten ein (ohne -Djava.library.path=) Am besten wäre es vom Manifest aus

Nachtrag:
Wenn ich die *.dll Dateien im Projektordner liegen habe(nicht im java.library.path), werden sie gefunden. Ist das nicht auch möglich, soetwas in einem Jar-File hinzubekommen....


----------



## Wildcard (18. Apr 2007)

Windows kann keine dlls aus Archiven laden.
Warum bindest du es nicht einfach mit nativlib ein?


----------



## Ulmerschwabe (18. Apr 2007)

reicht es aus, die *.dll dann einfach in das Jar mit reinzupacken? Oder muss ich dann die Bibliotheken via System.load noch laden

Habe:

```
<resources>
  <j2se version="1.3+"/>

  <j2se version="1.5+"/>
  <j2se version="1.6+"/>
  <jar href="roboterGUI.jar" main="true" download="eager"/>
  <nativelib href="roboterGUI.jar"/>
</resources>
```

Im jnlp


Edit:
Habe lediglich obiges hinzugefügt und er wirft eine Fehlermeldung, dass er die j3dorg nicht findet


```
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.sun.javaws.Launcher.executeApplication(Unknown Source)
	at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
	at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
	at com.sun.javaws.Launcher.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.UnsatisfiedLinkError: no j3dcore-ogl in java.library.path
	at java.lang.ClassLoader.loadLibrary(Unknown Source)
	at java.lang.Runtime.loadLibrary0(Unknown Source)
	at java.lang.System.loadLibrary(Unknown Source)
	at javax.media.j3d.NativePipeline$1.run(NativePipeline.java:138)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.media.j3d.NativePipeline.loadLibrary(NativePipeline.java:135)
	at javax.media.j3d.NativePipeline.loadLibraries(NativePipeline.java:95)
	at javax.media.j3d.MasterControl.loadLibraries(MasterControl.java:785)
	at javax.media.j3d.VirtualUniverse.<clinit>(VirtualUniverse.java:259)
	at robotGUI.Map3DControl.init(Map3DControl.java:58)
	at robotGUI.Map3DControl.<init>(Map3DControl.java:52)
	at robotGUI.GuiMain.init(GuiMain.java:41)
	at robotGUI.GuiMain.<init>(GuiMain.java:23)
	at robotGUI.GuiMain.main(GuiMain.java:17)
	... 9 more
```

Ich denke, dass sie dann in den einzelnen Packages geladen wereden.


----------



## Wildcard (18. Apr 2007)

Nein, die dlls werden nicht in das jar gepackt. Die liegen einfach auf dem Server so das sie anhand des jnlp Files gefunden werden können.
Für genauere Informationen lege ich dir den webstart developers guide den ich gepostet habe ans Herz, da steht eigentlich alles wissenswerte drin.


----------



## Guest (18. Apr 2007)

Super, hat geklappt.

Danke für den Tipp

Viele Grüße


----------

