web-dev-qa-db-fra.com

Puis-je appeler Java depuis Node.js via JNI et comment?

puis-je appeler Java de Node.js via JNI ? Y a-t-il des exemples?

44
Kay Pale

Cela semble compliqué. Node.JS fonctionne sur Google Chrome Moteur JavaScript V8 . Ce que vous devrez faire est de créer une liaison V8 C++ ( v8 c ++ Crash Course) montre un exemple) qui démarre une JVM et fait tout le traitement JNI.

Je pense que vous feriez mieux de laisser un JavaServer et Node.js communiquer via le réseau (quelqu'un a écrit un exemple pour utiliser RabbitMQ pour la communication basée sur les messages Java/Node.js). Ici, JSON serait un excellent format d'échange de données (si vous faites confiance à votre Java produit un JSON approprié, vous pouvez simplement l'évaluer () dans Node).

9
Daff

Vous devriez essayer le module node-Java npm qui est un wrapper bien écrit sur JNI.

node-jave ne semble pas (encore) avoir une large adoption, mais en jouant avec lui, j'ai été impressionné par sa simplicité et sa robustesse.

C'est aussi simple que:

var list = Java.newInstanceSync("Java.util.ArrayList");
list.addSync("item1");
list.addSync("item2");
console.log(list.getSync(1)); // prints "item2"

Vous pouvez faire à peu près n'importe quoi avec votre machine virtuelle Java intégrée - créer des objets, des méthodes d'appel, des champs d'accès, etc.

Il existe un léger décalage d'impédance entre Node et Java, donc si vous allez interagir avec quelque chose de compliqué, je vous recommande d'écrire la plupart de vos interactions en Java = et exposant une interface plus simple à travers la barrière Node/Java. Cela facilite simplement le débogage de cette façon.

--- Dave

p.s., RealWorldUseCase (tm): J'ai travaillé dans un endroit qui avait un protocole assez complexe (et codé en spaghetti) entre plusieurs clients de navigateur et un service basé sur Java. J'ai écrit un test-harnais assez doux qui utilise jsdom pour héberger N navigateurs simulés et utilise node-Java comme un wrapper autour du Java Il était trivial de shimer les interfaces de transport, à la fois dans JS pour les clients et dans Java pour le service, donc chaque fois que l'une de ces choses envoie un message, je capture cela et le coller dans une file d'attente pour une livraison probabiliste à la cible prévue (c'est-à-dire que j'ai virtualisé le réseau). De cette façon, je pourrais exécuter une simulation complète de plusieurs clients interagissant avec et via un Java = service, et exécuter le tout dans un seul processus sans aucune communication par câble. Et ensuite, je pouvais faire des trucs amusants comme réorganiser délibérément la livraison des messages pour m'assurer que le code était résilient à la synchronisation des bogues. Et lorsqu'un bogue a été découvert, j'ai eu le les commandes de messages enregistrées et pourraient les reproduire pour reprocher le bogue. Oh, et le tout s'est installé et a exécuté un scénario assez complexe avec quelques milliers de lignes de journalisation et f fini en moins de 1 seconde par course. 2 semaines bien dépensées. Truc amusant.

RealWorld Use Case # 2: Selenium-inproc - un module qui encapsule le fichier JAR SeleniumRC fournissant une interface de nœud pour les tests d'automatisation du navigateur w/ Selenium sans avoir à exécuter encore un autre hôte local un service.

106
Dave Dopson

La communication peut être effectuée par child_process.

engendrer un nouveau processus et exécuter une classe principale. Cette classe principale renvoie la sortie à la console. afin que les données soient disponibles pour le nœud stdout data un événement.

var cmd    = require('child_process').spawn('Java', ['Main']);

cmd.stdout.on('data', function (data) {
  console.log('stdout: ' + data); // This will print string returned by Main class.
});
5
Yogesh Agrawal

Je me demande si c'est possible du tout. mais même si c'est possible, j'imagine que c'est difficile à mettre en œuvre et je suis certain que personne ne l'a encore fait.

que diriez-vous d'utiliser un nommé pipe pour communiquer entre les processus (Java et node.js)?

0
Alfred

Je pense que ce que vous recherchez est une extension native à utiliser comme pont. Bien que je n'ai pas d'exemple de ce que vous dites, j'ai un exemple sur la façon d'appeler une extension C++ à l'aide de Node.JS

https://github.com/jrgleason/NodeJSArduinoLEDController

0
Jackie

Je ne connais pas tous les détails de Node.js mais je suppose que votre mention de JNI est en fait l'interface Java Native. On ne peut utiliser JNI que de Java, donc à mon humble avis, il ne le fait pas il est logique d'accéder à Java à partir de JNI si vous n'êtes pas déjà en Java.

Il semblerait que ce soit la mauvaise approche, et vous devez rechercher dans le doco Node.js leur chapitre d'intégration ...

0
mP.