posso chiamare Java da Node.js tramite JNI? Ci sono degli esempi?Posso chiamare Java da Node.js tramite JNI e come?
risposta
Sembra strano. Node.JS viene eseguito sul motore JavaScript di Google Chrome V8. Quello che dovrete fare è creare un binding V8 C++ (v8 c++ Crash Course mostra un esempio) che avvia una JVM e gestisce tutto il JNI.
Penso che potrebbe essere meglio lasciare un JavaServer e Node.js comunicare tramite la rete (qualcuno ha scritto un example for using RabbitMQ per la comunicazione basata su messaggio Java/Node.js). Qui, JSON sarebbe un ottimo formato per lo scambio di dati (se ti fidi che il tuo server Java produca JSON corretto, puoi semplicemente eval() in Node).
Interessante a saperlo. ma suppongo che l'accesso alla rete, dovrebbe essere almeno un ordine di grandezza più lento del JNI. Don: tu pensi? –
Dipende da cosa vuoi fare. L'approccio JNI sarà MOLTO di lavoro e un diavolo di debug (JNI da solo è già un dolore e sarà molto peggio con V8 -> C++ -> JNI -> Java). – Daff
che ne dici di utilizzare redis come livello di accodamento, una soluzione più semplice. –
Non sono a conoscenza di tutti i dettagli di Node.js ma presumo che la tua segnalazione di JNI sia in realtà l'interfaccia nativa Java. Si può usare solo JNI da Java, quindi non è opportuno accedere a Java da JNI se non si è già in java.
Sembrerebbe che questo è l'approccio sbagliato, ed è necessario cercare la doco Node.js per la loro integrazione capitolo ...
In realtà, JNI copre anche l'invocazione JVM, non solo le chiamate native da Java. –
@ monaco software, la tua affermazione è giusta, ma nel ctx di q, il suo nodo js difficile da immaginare usa jni per tutti i suoi javaismi. –
Mi chiedo se è possibile a tutti. ma anche se è possibile, immagino sia difficile da attuare e sono certo che nessuno lo abbia ancora fatto.
come utilizzare un named pipe per comunicare tra processi (java e node.js)?
La comunicazione può essere eseguita da child_process.
spawn un nuovo processo ed esegue una classe Main. Questa classe principale restituisce l'output alla console. quindi i dati sono disponibili per l'evento stdout data
del nodo.
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.
});
Si dovrebbe provare il modulo n23 node-java che è un involucro ben scritto su JNI.
nodo-jave non sembra (ancora) avere un'ampia adozione, ma giocando con esso, sono stato impressionato da quanto semplice e robusto è stato.
E 'semplice come:
var list = java.newInstanceSync("java.util.ArrayList");
list.addSync("item1");
list.addSync("item2");
console.log(list.getSync(1)); // prints "item2"
È possibile fare qualsiasi cosa con il tuo JVM incorporato - creare oggetti, metodi di chiamata, i campi di accesso, ecc
C'è un leggero disadattamento di impedenza tra il Nodo e Java, quindi se hai intenzione di interagire con qualcosa di complicato, ti consiglio di scrivere la maggior parte delle tue interazioni in Java e di esporre un'interfaccia più semplice attraverso la barriera Nodo/Java. Semplifica il debug in questo modo.
--- Dave
P.S., RealWorldUseCase (tm): Ho lavorato in un posto che aveva un bel complesso (e gli spaghetti-coded), il protocollo tra più client browser e di un servizio basato su Java. Ho scritto un bel test-harness che utilizzava jsdom per ospitare N browser simulati e utilizzava node-java come wrapper attorno al codice del servizio Java. È stato banale eliminare le interfacce di trasporto, sia in JS per i client, sia in Java per il servizio, quindi ogni volta che una di queste cose invia un messaggio, lo catturo e lo inserisco in una coda per il recapito probabilistico all'obiettivo desiderato (cioè, ho virtualizzato la rete).In questo modo, potrei eseguire una simulazione completa di più client che interagiscono con e attraverso un servizio Java ed eseguire l'intera operazione all'interno di un singolo processo senza alcuna comunicazione via cavo. E poi ho potuto fare cose divertenti come riordinare deliberatamente le consegne dei messaggi per assicurarmi che il codice fosse resistente ai bug di temporizzazione. E quando è stato scoperto un bug, ho registrato gli ordini dei messaggi e sono riuscito a riprodurli per riprodurre il bug. Oh, e il tutto è stato configurato e gestito uno scenario piuttosto complesso con alcune migliaia di righe di registrazione e terminato in meno di 1 secondo per esecuzione. 2 settimane ben speso. Cose divertenti.
Caso di utilizzo di RealWorld n. 2: selenium-inproc - un modulo che include il file JAR SeleniumRC che fornisce un'interfaccia nodo al test di automazione del browser w/Selenium senza dover eseguire ancora un altro servizio di localhost.
questa dovrebbe essere la risposta giusta. – Ventura
Funziona con librerie di terze parti come Gurobi? http://www.gurobi.com/ –
Penso che quello che stai cercando sia un'estensione nativa da utilizzare come bridge. Anche se non ho un esempio di quello che stai dicendo, io ho un esempio su come chiamare un interno C++ utilizzando Node.JS
Penso che la risposta approvata è un po 'vecchio. Vale la pena provare: https://github.com/joeferner/node-java
- 1. Chiamare una DLL da un'applet tramite JNI
- 2. Chiamare in un oggetto java salvato tramite JNI da una filettatura diversa
- 3. Come chiamare C++ da Java?
- 4. Come chiamare un metodo di super classe sottoposto a override in Java tramite JNI?
- 5. come restituire enum da JNI
- 6. Come chiamare un metodo Java da C++/JNI che accetta un parametro Android Contesto
- 7. Chiamare uno script node.js dall'interno di java
- 8. Come restituire l'array int da Java a JNI
- 9. Invio di dati da node.js a Java tramite i socket
- 10. Come chiamare il metodo vararg Java da C con valist
- 11. Chiamare il metodo API Win32 da Java
- 12. forza Java per chiamare il mio distruttore C++ (JNI)
- 13. Manipolazione di ByteBuffer da JNI
- 14. Java. JNI. jvm.dll
- 15. Restituzione di una classe C++ a Java tramite JNI
- 16. Chiamare Rust da Java
- 17. Come chiamare la funzionalità C++ da java
- 18. È possibile chiamare il codice Java C++?
- 19. Invia JNI C stderr/stdout tramite log4j
- 20. È possibile collegare una libreria statica a Java tramite JNI?
- 21. JNI restituisce la funzione Signal 7 cercando di chiamare Java da C++
- 22. Impossibile chiamare la funzione membro di C++ da java utilizzando JNI
- 23. Chiamare Java da MATLAB?
- 24. Come chiamare un servlet da codice Java
- 25. Mac + jni + java
- 26. Come chiamare il metodo lato server node.js da javascript?
- 27. Come chiamare le funzioni Java da C++?
- 28. Come chiamare la classe java da jmeter?
- 29. Passaggio di stringhe a doppio byte (WCHAR) da C++ a Java tramite JNI
- 30. Nome classe da jclass in JNI
'Node.js' sembra il file di script java e JNI è utilizzato per accedere alle funzionalità native, puoi per favore elaborare la tua domanda –
Se puoi usare Rhino invece di Node.js, l'interfacciamento è davvero facile: https://developer.mozilla.org/en-US/docs/Scripting_Java –