Puis-je appeler Java à partir de Node.js via JNI et comment?

puis-je appeler Java à partir de Node.js via JNI? Existe-il des exemples?

44
demandé sur Kay Pale 2011-01-19 00:07:30

7 réponses

Cela semble difficile. Nœud.JS fonctionne sur le moteur JavaScript de Google Chrome V8. Ce que vous aurez à faire est de créer une liaison V8 c++ (v8 c++ Cours intensif montre un exemple) qui démarre une JVM et effectue toutes les manipulations JNI.

je pense que vous pourriez être mieux de laisser un JavaServer et le Nœud.js communiquer via le réseau (quelqu'un a écrit un exemple D'utilisation de RabbitMQ pour Java/Nœud.js communication basée sur les messages). Ici, JSON serait un grand format d'échange de données (si vous croyez que votre serveur Java produit JSON approprié, vous pouvez simplement l'eval () dans Node).

7
répondu Daff 2016-10-14 19:35:20

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

node-jave ne semble pas (encore) avoir une large adoption, mais en jouant avec, 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 JVM - créer des objets, des méthodes d'appel, des champs d'accès, etc.

il y a une légère asymétrie 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 d'exposer une interface plus simple à travers la barrière Node/Java. Cela facilite 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 joli test-harnais qui utilisé jsdom pour héberger N simulé et navigateurs utilisés node-java comme un wrapper autour du code de service Java. Il était trivial de raccourcir les interfaces de transport, à la fois en JS pour les clients, et en Java pour le service, donc chaque fois que l'une de ces choses envoie un message, je le capture et le colle dans une file d'attente pour la livraison probabiliste à la cible visée (c'est-à-dire, j'ai virtualisé le réseau). De cette façon, je pourrais exécuter une simulation complète de plusieurs clients interagissant avec et à travers un service Java, et exécuter l'ensemble de la chose dans un processus unique sans aucune communication par fil. Et ensuite je pourrais faire des choses amusantes comme réorganiser délibérément les livraisons de messages pour s'assurer que le code était résistant aux bogues temporels. Et quand un bug a été découvert, j'ai fait enregistrer les commandes de messages et j'ai pu les reproduire pour reprogrammer le bug. OH, et tout le truc s'est installé et a lancé un scénario assez complexe avec quelques milliers de lignes de journalisation et fini en moins d'une seconde par course. 2 semaines bien passées. Choses amusantes.

RealWorld Cas D'Utilisation N ° 2: sélénium inproc - un module qui enveloppe le fichier JAR SeleniumRC fournissant une interface de noeud pour les tests d'automatisation du navigateur w/Sélénium sans avoir à exécuter encore un autre service localhost.

102
répondu Dave Dopson 2012-09-02 20:44:16

la Communication peut être faite par child_process.

lancer un nouveau processus et d'exécuter une classe Principale. Cette classe principale renvoie la sortie à la console. ainsi les données sont disponibles pour les noeuds stdout data é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
répondu Yogesh Agrawal 2012-01-06 10:24:36

Je ne suis pas au courant de tous les détails du noeud.js mais je suppose que votre mention de JNI est en fait L'Interface Java Native. On ne peut utiliser JNI que depuis Java, donc imho cela n'a pas de sens d'accéder à Java depuis JNI si vous n'êtes pas déjà en java.

il semblerait que ce soit la mauvaise approche, et vous devez rechercher le noeud.js doco pour leur chapitre sur l'intégration...

0
répondu mP. 2011-01-18 21:22:59

je me demande si c'est possible. mais même si c'est possible j'imagine que c'est difficile à mettre en place et je suis certain que personne n'a encore fait.

Que diriez-vous d'utiliser un pipe nommà © e pour communiquer entre les processus(java et node.js)?

0
répondu Alfred 2011-01-18 22:09:54

je pense que ce que vous recherchez est une extension native à utiliser comme un 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++ en utilisant un noeud.JS

https://github.com/jrgleason/NodeJSArduinoLEDController

0
répondu Jackie 2012-05-10 15:13:27

je pense que la réponse approuvée est un peu vieille. Il peut être vaut la peine d'essayer: https://github.com/joeferner/node-java

0
répondu Arjun Dhar 2015-10-23 04:31:46