JNI: Methoden aus unterschiedlichen Threads aufrufen

Kartoffel

Mitglied
Hallo zusammen,

ich habe gerade ein Problem, mit einem JNI Wrapper, den ich um eine existierende DLL herum baue.
Es geht darum, dass mein Programm komplett terminiert, sobald ich eine native methode aus einem Thread aufrufe, dass nicht das Thread ist, welches die DLL geladen hat.
Es gibt auch keinen dump oder sowas. Die VM schmiert komplett ab und ich seh keinen Trace.
Das ganze funktioniert, wenn ich die Methode aus dem Thread aufrufe, dass die DLL geladen hat (ich nenne das mal DLL-Thread).
Ich muss das ganze allerdings von einem anderen Thread aus aufrufen. Der Grund hierfür ist, dass mein DLL-Thread eine blockierende Methode aus der DLL aufruft. Diese Methode kann aber nur (hart) gestoppt werden, wenn ich eine andere Methode zum abbrechen in der DLL aufrufe. Das muss ich aber aus einem anderen Thread machen, weil mein DLL-Thread ja blockiert ist.
Hat jemand damit schon Erfahrung, und kann mir nen Tipp geben, was ich hier machen kann?


Gruß
Kartoffel
 
Bisher habe ich das Verhalten noch nicht beobachtet, auch bei Zugriffen aus mehrern Threads. Es gibt aber viele Stellen, wo das was im Argen liegen könnte. Als erster pragmatischer Test, um den Fehler schonmal sark einzugrenzen, würde sich anbieten in der "blockierenden" JNI-Methode mal NUR sowas zu machen wie
while (1) { /* do nothing */ }
und in der, die die Methode unterbrechen sollte, nichts außer vielleicht einen printf zum debuggen. Dann sieht man, ob es am Aufruf an sich liegt, oder an dem, was IN den Methoden jeweils gemacht wird. (Ggf. muss man da die JavaVM speichern und mit AttachCurrentThread & Co rumfrickeln (sollte eigentlich nicht notwendig sein, aber ... ich erwähn's mal weil's mit Threads zu tun hat 😳 😀 ) ... )
 
Danke für die Tipps. Mit printf hab ich wenigstens mal die Stelle genauer gefunden wo es abraucht.
Mittlerweile habe ich auch festgestellt, dass ich einfach die DLL falsch aufgerufen habe. Ein wenig rumprobieren hat zum Erfolg geführt. Also kein JNI Problem, sondern eher ein "schlechte Doku" Problem 🙂.

Danke und Gruß!
 
Du hast mit größter Wahrscheinlichkeit einen Fehler in der nativen Implementierung, vermutlich nicht ordentlich synchronisierte konkurrierende Zugriffe.
Ist die Library denn überhaupt für konkurrierende Zugriffe ausgelegt? Ist das "harte(?)" Beenden denn der richtige Weg mit dieser Situation umzugehen?
 

Zurück
Oben