Laden von DLLs - Diff zw. Java 1.4 u. Java 6?

Hallo Leute

Kann es sein, dass sich von Java 1.4 auf Java 6 etwas grundlegendes beim Laden von externen Bibliotheken (unter Windows also DLLs) getan hat?

Wir haben eine Java-Anwendung, die unter Windows XP SP2 läuft. Als VM kommt in der alten Version der Anwendung Java 1.4.2_04 und in der neuen Version der Anwendung Java 1.6.0_11 zum Einsatz. Diejenigen Klassen, die die DLL aufrufen, haben sich zwischen den beiden Versionen vom Code her nicht geändert - sie wurden lediglich mit dem neuen JDK neu kompiliert.

Der erste Unterschied, der uns auffällt, ist ein rein optischer: die aufgerufene Methode der DLL öffnet u.a. einen simplen Dialog mit einem Passworteingabefeld. Die eingegebenen Zeichen werden dabei maskiert. Wird die DLL unter Java 1.4 aufgerufen, werden Sternchen (*) als Maskierungszeichen verwendet. Unter Java 6 hingegen Pipe-Zeichen (|). Obwohl mich das Verhalten wundert, stört es mich wenig.

Was mich stört ist, dass der Aufruf der DLL unter Java 6 manchmal ohne direkt ersichtlichen Grund fehlschlägt. Es scheint allerdings damit zusamenzuhängen, dass die Anwendung längere Zeit nicht benutzt wurde (PC über nach bei aktiver Anwendung laufen lassen) bzw. dass der PC bei aktiver Anwendung auf Stand-By geschaltet wurde.

Unter Java 1.4 haben wir diese Probleme nicht beobachten können. Ein Rückstieg der Anwendung auf Java 1.4 ist allerdings inzwischen nicht mehr sinnvoll möglich (sprich: zu teuer).

Kennt jemand diese Probleme - und vielleicht sogar eine Abhilfe?

LG
Erwin

Kennt jemand diese Probleme - und vielleicht sogar eine
Abhilfe?

Ich kenne dieses Problem nicht und der Aufruf von DLLs klappt hier in meinen Projekten unter Java 1.6 einwandfrei.

Es wäre vermutlich aber hilfreich zu wissen, wie ihr die DLL aufruft, wie ihr sie lädt (loadLibrary, gar nicht, etc) wo die DLL liegt (im Pfad, explizites Verzeichnis, etc) usw usf.

Am besten wäre es natürlich, wenn du ein Minimal-Beispiel erstellen könntest, das einfach eine Windows-DLL aufruft und das sich in Java 1.4 und Java 1.6 unterschiedlich verhält. Dann könnte man das eventuell selbst nachvollziehen und ermitteln, woran das liegt und wie man dem Abhilfe schafft.

hallo

leider darf ich nicht alle details posten - unternehmenspolitik und so. im groben und ganzen schaut es so aus:

die dll liegt ganz normal im systempfad von windows (für das beispiel nehmen wir mal „c:\windows\system32\extern.dll“ an). in der dll ist u.a. eine methode „checkPassword“ drinnen.

aus java heraus wird das so aufgerufen:

public class PasswordCheck {
 public PasswordCheck() {
 super();
 }

 public native int checkPassword();

 static {
 System.loadLibrary("extern");
 }
}

public class Authentification {
 public Authentification() {
 super();
 }

 public boolean checkPassword() {
 PasswordCheck check = new PasswordCheck();
 int ok = check.checkPassword();
 return (ok == 0);
 }
}

die dll an sich funktioniert. sogar wenn der fehler in der java-anwendung auftritt, kann man mit einem „normalen“ programm (z.b. in C erstellt) die dll ansprechen. wenn man die java-anwendung nur beendet und neu startet bleibt das problem bestehen. wird zuerst die java-anwendung beendet, dann die dll von einem anderen programm aufgerufen und danach die java-anwendung neu gestartet, klappt es wieder aus der java-anwendung heraus.

das problem äussert sich darin, dass der wert, den die dll zurückliefert, nicht dem erwarteten ergebnis entspricht (im obigen beispiel liefert die dll z.b. 1 obwohl eigentlich der wert 0 kommen sollte).

meine vermutung wäre, dass der garbage collector irgendwie die dll entläd und später nicht neu ladet - wüsste aber nicht, warum das der gc machen sollte bzw. wie. wäre aber zumindest ein ansatzpunkt, da ich mir ziemlich sicher bin, dass der gc zwischen 1.4 und 6 überarbeitet wurde.

lg
erwin