JNI_CreateJavaVM () schlägt jedes Mal fehl, wenn ich meine Anwendung (genau) ausführe

8

Ich habe eine Windows MFC-Anwendung, die:

(1) Lädt die JVM ( JNI_CreateJavaVM() )

(2) Hängt den Haupt-Thread an die JVM ( AttachCurrentThread() )

an

(3) Lädt einige Java-Klassen und -Methoden ( FindClass() und GetMethodID() / GetStaticMethodID() )

(4) Registriert einige native Callbacks zur Verwendung durch Java-Code ( RegisterNatives() )

(5) Löst den Thread von JVM ( DetachCurrentThread() )

(6) Zerstört die JVM ( DestroyJavaVM() )

Alle oben genannten Funktionen sind jedes Mal erfolgreich Ich führe die Anwendung aus. Ich weiß, dass sie erfolgreich sind, weil ich zusätzlich zu dem oben genannten mit der Anwendung interagiere und erfolgreich statische Java-Methoden aufruft, und diese Java-Methoden rufen erfolgreich meine nativen Callbacks auf. Meine Anwendung wird ordnungsgemäß beendet, und es ist sicher, dass die erwarteten Java-Funktionen und systemeigenen Rückrufe ausgeführt wurden.

Allerdings jedes zweite Mal , dass ich die Anwendung ausführe, schlägt der Aufruf von JNI_CreateJavaVM() fehl (die JavaVM * wird nicht ausgefüllt). Absolut nichts ändert sich zwischen den Läufen der Anwendung . Ich führe es einfach einmal aus (erfolgreich, sogar ohne , außer den obigen sechs Schritten), höre elegant auf, laufe wieder und es schlägt fehl, hin und her. Es gibt keine Ausnahmen für den Hin und Her Erfolg / Misserfolg - ich kann es Dutzende Male ausführen, und es oszilliert genau jedes andere Mal zwischen Erfolg und fehlgeschlagen an der JNI_CreateJavaVM() -Zeile.

Wenn nötig, werde ich mehr Code einfügen. Ich hoffe jedoch, dass jemand einen Einblick in meine Arbeit hat. (Hinweis: Dies ist eine BCGSoft MFC-Eigenschaftsblatt-Anwendung, obwohl ich stark bezweifle, dass das wichtig ist.)

    
Dan Nissenbaum 04.05.2012, 06:11
quelle

1 Antwort

4

Es sieht so aus, als ob Sie in diesen Fehler ( hier ), das wird wahrscheinlich nie repariert werden.

Trotz seines Namens zerstört DestroyJavaVM() die JVM nicht. Was es tut, ist der JVM zu signalisieren, dass es herunterfahren sollte, aber die JVM wartet tatsächlich, bis alle Threads außer dem Main-Thread gestoppt haben, bevor es tatsächlich herunterfährt. In der Tat, auch dann ist es nicht vollständig nach sich selbst aufräumen, als die Dokumentation (ziemlich kryptisch ): "Das JDK / JRE wird immer noch nicht unterstützt VM entladen jedoch. "

Ich mache mir auch Sorgen um Schritt 2, "hängt den Haupt-Thread an die JVM an". Sie müssen den Thread, der die JVM erstellt hat, nicht an die JVM anhängen, und Sie können diesen Thread nicht trennen. Wenn Sie das wirklich tun, ist es möglich, dass das Ihr System durcheinander bringt. (Der Thread, der die JVM erstellt, ist der "Main" -Thread der JVM. Sie müssen nur andere native Threads an die JVM anfügen / trennen, wenn sie darauf zugreifen müssen.)

Übrigens, JNI_CreateJavaVM() gibt bei Erfolg 0 zurück, und Sie sagen, es gibt 0 die "fehlgeschlagenen" Zeiten zurück, also in welchem ​​Sinne scheitert es? Welche JVM (Version, Hersteller) verwendest du?

    
Old Pro 17.05.2012, 06:38
quelle