Soru Java'yı Node.js'den JNI üzerinden nasıl arayabilirim ve nasıl yapabilirim?


Java'yı Node.js'den şu adresten arayabilir miyim? JNI'yı? Herhangi bir örnek var mı?


44
2018-01-18 21:07


Menşei


Node.js  java komut dosyası ve JNI yerel işlevsellik erişmek için kullanılır gibi görünüyor, lütfen sorunuz ayrıntılı olabilir - Jigar Joshi
Node.js yerine Rhino'yu kullanabiliyorsanız, arayüzleme gerçekten çok kolaydır: developer.mozilla.org/en-US/docs/Scripting_Java - Janus Troelsen


Cevaplar:


Bu zor görünüyor. Node.JS, Google Chrome JavaScript motorunda çalışır V8. Yapmanız gereken şey bir V8 C ++ bağlaması oluşturmaktır (v8 c ++ Kilitlenme Kursu bir JVM'yi başlatan ve tüm JNI işlemlerini yapan bir örnek gösterir.

Bir JavaServer ve Node.js'nin ağ üzerinden iletişim kurmasına izin vermenin daha iyi olabileceğini düşünüyorum ( RabbitMQ kullanımı için örnek Java / Node.js ileti tabanlı iletişim için). Burada JSON harika bir veri değişim formatı olacaktır (eğer Java sunucunuz doğru JSON üretiyorsa, sadece Node'da değerlendirebilirsiniz).


7
2018-01-18 21:17



Bunu bilmek ilginç. fakat sanırım ki, bu ağ erişimi, en azından JNI'nin daha yavaş bir büyüklük sırasına sahip olmak zorundaydı. Sence de değil mi? - Kay Pale
Bu ne yapmak istediğinize bağlıdır. JNI yaklaşımı işin bir sürü ve hata ayıklamak için bir cehennem olacak (JNI tek başına bir acıdır ve V8 -> C ++ -> JNI -> Java ile çok daha kötü olacaktır). - Daff
Redis'i sıraya koyma katmanı olarak kullanma, daha basit bir çözüm. - Ali Salehi
Gerçek bir mesajlaşma kuyruğu daha çok düşünüyordum, ör. ZeroMQ gibi (zero.mq) - Daff
Dave'in cevabı İşte (> 60 upvotes), node-java npm modülünden bahseden kabul edilen cevap olmalıdır. - tresf


Denemelisin Düğüm-Java JNI üzerinde iyi yazılmış bir sarıcı olan npm modülü.

node-jave (henüz), geniş bir evlat edinmiş gibi görünmese de, onunla oynamak, ne kadar basit ve sağlam olduğu konusunda çok etkilendim.

Bu kadar basit:

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

Gömülü JVM'niz ile hemen hemen her şeyi yapabilirsiniz - nesneler, çağrı yöntemleri, erişim alanları vb.

Düğüm ve Java arasında küçük bir empedans uyuşmazlığı var, bu yüzden karmaşık bir şeyle etkileşime girecekseniz, etkileşimlerinizin çoğunu Java'da yazmanızı ve Node / Java engelini aşarak daha basit bir arayüz sunmanızı tavsiye ederim. Sadece bu şekilde daha kolay hata ayıklama yapar.

--- Dave

p.s., RealWorldUseCase (tm): Birden çok tarayıcı istemcisi ile Java tabanlı hizmet arasında oldukça karmaşık (ve spagetti kodlu) bir protokolü olan bir yerde çalıştım. Kullanılan oldukça tatlı bir test demeti yazdım. jsdom N simüle tarayıcıları barındırmak ve kullanılan Düğüm-Java Java servis kodu etrafında bir sarıcı olarak. Hem istemciler için JS'de hem de hizmet için Java'da taşıma arabirimlerini kapatmak çok önemliydi, bu nedenle, bu şeylerden herhangi biri bir ileti gönderdiğinde, bunu yakalarım ve istenen hedefe olasılıksal teslimat için bir kuyruğa yapıştıracağım. (yani, ağı sanallaştırdım). Bu sayede bir Java servisi ile etkileşimde bulunan birden fazla müşterinin tam bir simülasyonunu çalıştırabilirim ve her şeyi telsiz haberleşme olmadan tek bir işlem içinde çalıştırabilirim. Ve sonra, kodun zamanlama hatalarına karşı dayanıklı olduğundan emin olmak için bilinçli olarak ileti gönderimlerini yeniden düzenlemek gibi eğlenceli şeyler yapabilirim. Ve bir hata keşfedildiğinde, mesaj siparişlerinin kaydedildiğini ve hataları yeniden üretmek için bunları yeniden üretebildim. Oh, ve her şey, birkaç bin satırlık kayıt ile oldukça karmaşık bir senaryo oluşturdu ve her bir koşuda 1 saniyenin altında bitti. 2 hafta iyi harcanmış. Eğlenceli şeyler.

RealWorld Kullanım Örneği # 2: selenyum-inproc - Tarayıcı otomasyon testine bir düğüm arayüzü sağlayan SeleniumRC JAR dosyasını saran bir modül Selenyum başka bir localhost hizmeti çalıştırmak zorunda kalmadan.


102
2018-02-19 20:14



Bu doğru cevap olmalı. - Ventura
Bu Gurobi gibi üçüncü parti kütüphaneleri ile çalışır mı? gurobi.com - Karthik Balakrishnan


İletişim child_process tarafından yapılabilir.

yeni bir süreç oluşturup bir Ana sınıfı yürütmek. Bu ana sınıf çıktıyı konsola geri döndürüyor. böylece düğümün verileri kullanılabilir stdout dataEtkinlik.

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
2018-01-06 10:18





Node.js'nin tüm ayrıntılarını bilmiyorum ama JNI'den bahsetmenin aslında Java Native Interface olduğunu varsayıyorum. JNI'yi Java'dan sadece kullanabilirsiniz, bu yüzden java'da değilseniz JNI'dan Java'ya ulaşmak mantıklı değildir.

Görünüşe göre bu yanlış bir yaklaşım ve entegrasyon bölümü için Node.js doco'sunu aramanız gerekiyor ...


0
2018-01-18 21:22



Aslında JNI, JVM çağrısını da kapsar, sadece Java'dan yerel çağrıları değil. - Lawrence Dol
@software keşiş, senin deyim oldukça doğru, ama q, ctx içinde, onun tüm javaisms tüm jni kullanarak düğüm js hayal etmek zor. - mP.


Hiç mümkün olup olmadığını merak ediyorum. ama mümkün olsa bile uygulamak zor olduğunu ve bunun henüz kimsenin yapmadığından emin olduğumu hayal ediyorum.

nasıl kullanılır? adlandırılmış boru süreçler arasında iletişim kurmak için (java ve node.js)?


0
2018-01-18 22:09





Aradığın şeyin köprü olarak kullanmak için yerel bir uzantı olduğunu düşünüyorum. Söylediklerinize dair bir örneğim olmamasına rağmen, Node.JS'yi kullanarak bir C ++ uzantısının nasıl çağrılacağına dair bir örneğim var.

https://github.com/jrgleason/NodeJSArduinoLEDController


0
2018-05-10 15:13





Onaylanmış cevabın biraz eski olduğunu düşünüyorum. Belki denemeye değer: https://github.com/joeferner/node-java


0
2017-10-23 04:31