2009-01-17 6 views

Répondre

2

Vous pouvez demander au code natif d'appeler une méthode Java pour recevoir l'événement. Il existe plusieurs articles sur JNI qui peuvent vous aider, tels que How to Call Java functions from C Using JNI.

+0

Bonjour David, Si le code natif appelait une méthode Java pour recevoir l'événement, comment puis-je transmettre le contrôle au programme Java principal? Il doit y avoir une seule instance du programme Java qui surveille et répond en permanence aux événements capturés par une API C. S'il vous plaît donnez votre avis. Je vous remercie. –

+0

En supposant que le code natif est le point d'entrée de votre application, il lance la JVM et exécute la méthode principale dans votre programme Java. Vous pouvez faire en sorte que cette méthode principale démarre un seul thread Java distinct, qui s'exécute en arrière-plan et reçoit des événements via des méthodes appelées par l'API C. –

2

La lecture JNI specification est requise si vous souhaitez effectuer une programmation JNI.

Il y a deux scénarios lors de l'appel du code Java de C. Dans le premier cas, le programme Java appelle une fonction méthode native , passer le contrôle à C. Le C reçoit comme premier argument un pointeur JNIEnv qui est le principal handle utilisé pour accéder à l'interface JNI. Un appel typique de Java à C ressemble à ceci:

jenv->CallStaticMethod(jenv, cls, ...); 

(. Notez que dans C++, les appels sont des méthodes appropriées, de sorte que vous n'avez pas besoin de passer jenv comme premier argument) Ceci est assez simple; Java appelle C qui rappelle en Java. Le deuxième cas est un peu plus complexe et doit être utilisé lorsque vous avez un code C qui doit effectuer un appel "spontané" en Java, c'est-à-dire non pas parce que ce code a été appelé par Java. C'est généralement le cas lorsque vous avez un thread natif générant des événements (comme dans votre cas). Vous devez ensuite utiliser une partie de l'interface JNI appelée Invocation API. Cette API est utilisée en deux étapes: vous devez d'abord demander une référence à la machine virtuelle Java que vous souhaitez appeler (certaines implémentations JVM prennent en charge plusieurs machines virtuelles Java dans le même processus) et la deuxième étape consiste à demander un pointeur JNIEnv pour effectuer des appels dans la machine. JVM.

Afin d'obtenir un pointeur JNIEnv pour effectuer des appels dans la JVM, le thread natif doit "se connecter" à la JVM. Ceci est fait afin de rendre la JVM "consciente" du thread, et après avoir attaché un thread à la JVM, le thread peut être considéré comme n'importe quel autre thread Java (en fait, je ne suis pas sûr qu'il y en ait différences réelles). Si vous inspectez les threads de la JVM dans un débogueur, le thread natif apparaîtra comme n'importe quel autre thread. Notez que vous pouvez marquer le thread natif comme étant un thread démon, donc quand la JVM se ferme, le thread sera détruit.

Notez, cependant, que vous devrez prendre proper precautions lorsque vous effectuez des opérations dans un gestionnaire de signal Unix. Je recommande pas appelant Java directement à partir d'un gestionnaire de signal.

Questions connexes