2012-04-06 5 views
1

Ich schreibe ein Java-Programm, das einen in c geschriebenen Hardwaretreiber verwendet. Dieser Hardware-Treiber startet einen Callback-Thread und Sie können Callback-Funktionen registrieren, die aufgerufen werden, wenn etwas passiert. Wie kann ich diesen Thread an den jvm anhängen, so dass er die Java-Methoden für diese Rückrufe aufrufen kann? Ich habe nur die Thread-ID zurückgegeben von der Funktion start_callbacks(), zurückgegeben als ein int, aber es ist die pthread_t im Aufruf von pthread_create() verwendet.Drittanbieter-Thread an vm anschließen, wenn jni verwendet wird

Eine Möglichkeit, die ich gefunden habe, ist, pthread_once am Anfang jeder Callback-Funktion zu verwenden und den Thread dort anzuhängen. Aber dann gibt es keine Möglichkeit, es zu lösen. Ich habe versucht, pthread_cleanup_push/pop zu verwenden, aber sie müssen als ein Paar aufgerufen werden, das hat nicht funktioniert.

Es scheint mir, dass meine einzige Option, dieses Recht zu tun, ist das Anhängen und Trennen des Threads bei jedem Callback-Aufruf. Oder den Treiber etwas umschreiben, was ich wirklich nicht machen möchte.

Gibt es etwas, das ich vermisst habe?

+0

Das ist wahrscheinlich nicht hilfreich, aber haben Sie in Erwägung gezogen, das Programm in C zu implementieren und System.exec oder etwas zu verwenden, um es mit Java zu verbinden? Ihr aktueller Ansatz erscheint mir technisch riskant. –

Antwort

2

Das ist genau das, was die JNI AttachCurrentThread() und DetachCurrentThread() nennen.

+0

Ja, ich weiß. Aber ich erstelle den Thread selbst nicht, also wie bekomme ich den Thread, AttachCurrentThread und DetachCurrentThread aufzurufen? Der einzige Code, den ich den Thread ausführen kann, sind die Callback-Funktionen. – liei

+0

Sie brauchen nicht den Thread, der 'AttachCurrentThread()' 'aufruft. Es hängt den aktuellen Thread an. Deshalb heißt es 'AttachCurrentThread()'. Offensichtlich müssen Sie diese Methoden innerhalb der Callback-Funktionen aufrufen. – EJP

+0

Ich weiß, dass das eine Lösung für das Problem ist, jedes Mal, wenn ein Rückruf durchgeführt wird, anzuhängen und zu lösen. Aber ich hatte gehofft, dass es einen Weg gab, den Thread dazu zu bringen, AttachCurrentThread und DetachCurrentThread nur einmal zu bestimmten Zeiten aufzurufen. Damit muss ich den Thread nicht jedes Mal anhängen, wenn ein Rückruf durchgeführt wird. Ich könnte überschätzt, wie kostspielig der Thread ist, die Häufigkeit der Rückrufe sind ein paar Sekunden, so dass es kein Problem sein könnte. Ich hätte es nur vorgezogen, den Thread einmal anzuhängen und abzutrennen, ist das die korrekte Methode, dies bei jedem Anruf zu tun, um ihn anzuhängen oder abzutrennen? – liei

Verwandte Themen