000
16.05.2003, 16:30 Uhr
virtual
Sexiest Bit alive (Operator)
|
Hallo,
ich habe einen C++ Wrapper geschrieben, in dem ich eine VM erzeuge und darin (man glaubt es kaum ) einige Javaklassen instanziiere. Die sache läuft recht rund, allerdings habe ich mit einer Sache schwere Probleme: wenn ich jetzt die VM löschen will, so blockt das DestroyJavaVM uner Umständen. Meine Nachforschungen haben folgendes Bild ergeben:
1. Lt Manual blockert der Call deshalb, weil noch auf einige Threads gewartet wird.
2. Solche Threads scheinen dann implizit in der VM instanziiert zu werden, wenn man zB eine Swingklasse instanziiert (ohne diese jdoch weiter zu verwenden), dann blockt DestroyJavaVM, bei NonGUI elementen offenbar nicht.
Daher folgende Fragen:
1. Hatte schon mal jemand ein ähnliches Problem, wenn ja: wie schaut die Lösung aus?
2. Meine Vermutung ist, daß die Objekte, die ich erzeuge, ggf nicht korrekt abgeräumt werden. Die JNI Doku bezieht sich leider vornehmlich auf den Fall, wo JNI verwendet wird, um auf nativen code zuzugreifen, ich machs halt anders rum. Wie räumt man ein jobject ab? (Derzeit mach ich explizit ein DeleteGlobalRef und ein DeleteLocalRef, sollte doch ausreichend sein!?)
3. Angenommen, ich räume die Objekte zwar korrekt ab, aber der GC wird nicht explizit vom DestroyJavaVM angeworfen, wie mache ich das dann per Hand (sorry, doofe Frage, aber ich kenn mich halt in Java noch nicht so gut aus wie in C++ [da weiß ich es nämlich: garnicht ]). Irgendwie "System.GC()"?
Nachtrag: JDK 1.3.1_08, Windows und Sun
TIA -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 16.05.2003 um 16:31 Uhr von virtual editiert. |