सवाल क्या मैं जेएनआई के माध्यम से जावा को नोड.जेएस से कॉल कर सकता हूं और कैसे?


क्या मैं जावा को Node.js से कॉल कर सकता हूं JNI? क्या कोई उदाहरण हैं?


44
2018-01-18 21:07


मूल


Node.js  जावा स्क्रिप्ट फ़ाइल और जेएनआई का उपयोग देशी कार्यक्षमता तक पहुंचने के लिए किया जाता है, क्या आप कृपया अपना प्रश्न विस्तृत कर सकते हैं - Jigar Joshi
यदि आप Node.js के बजाय राइनो का उपयोग कर सकते हैं, इंटरफेसिंग वास्तव में आसान है: developer.mozilla.org/en-US/docs/Scripting_Java - Janus Troelsen


जवाब:


यह मुश्किल लग रहा है। नोड.जेएस Google क्रोम जावास्क्रिप्ट इंजन पर चलता है वी 8। आपको क्या करना होगा एक वी 8 सी ++ बाध्यकारी बनाना है (v8 सी ++ क्रैश कोर्स एक उदाहरण दिखाता है) जो एक जेवीएम शुरू करता है और सभी जेएनआई हैंडलिंग करता है।

मुझे लगता है कि आप JavaServer और Node.js को नेटवर्क के माध्यम से संवाद करने से बेहतर हो सकते हैं (किसी ने लिखा है RabbitMQ का उपयोग करने के लिए उदाहरण जावा / नोड.जेएस संदेश आधारित संचार के लिए)। यहां, जेएसओएन एक महान डेटा एक्सचेंज प्रारूप होगा (यदि आप भरोसा करते हैं कि आपका जावा सर्वर उचित JSON उत्पन्न करता है तो आप इसे नोड में केवल eval () कर सकते हैं)।


7
2018-01-18 21:17



यह जानना दिलचस्प है। लेकिन मुझे लगता है कि नेटवर्क का उपयोग, कम से कम तीव्रता का आदेश होना चाहिए जो जेएनआई। क्या आपको नहीं लगता? - Kay Pale
यह आप पर निर्भर करता है की आप क्या करना चाहते हो। जेएनआई दृष्टिकोण बहुत काम करेगा और डीबग करने के लिए नरक होगा (अकेले जेएनआई अकेले दर्द है और यह वी 8 -> सी ++ -> जेएनआई -> जावा) के साथ बहुत खराब होगा। - Daff
रेडिस का उपयोग अपनी क्यूइंग परत के रूप में, एक आसान समाधान के रूप में करने के बारे में। - Ali Salehi
मैं एक वास्तविक संदेश कतार के बारे में सोच रहा था उदा। ज़ीरोएमक्यू की तरह (zero.mq) - Daff
डेव का जवाब यहाँ (> 60 अपवॉट्स) स्वीकृत उत्तर होना चाहिए, जो नोड-जावा एनपीएम मॉड्यूल के बारे में बोलता है। - tresf


आपको कोशिश करनी चाहिए नोड जावा एनपीएम मॉड्यूल जो जेएनआई पर एक अच्छी तरह लिखित रैपर है।

नोड-जेव (अभी तक) व्यापक रूप से गोद लेने के लिए प्रकट नहीं होता है, लेकिन इसके साथ खेल रहा है, मैं इस बात से प्रभावित हूं कि यह कितना सरल और मजबूत रहा है।

यह उतना आसान है जितना:

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

आप अपने एम्बेडेड जेवीएम के साथ कुछ भी कर सकते हैं - ऑब्जेक्ट्स बनाएं, कॉल विधियां, एक्सेस फ़ील्ड इत्यादि।

नोड और जावा के बीच मामूली प्रतिबाधा विसंगति है, इसलिए यदि आप जटिल कुछ के साथ बातचीत करने जा रहे हैं, तो मैं जावा में आपकी अधिकांश इंटरैक्शन लिखने और नोड / जावा बाधा में एक सरल इंटरफेस को उजागर करने की सलाह दूंगा। यह सिर्फ इस तरह से आसान डीबगिंग के लिए बनाता है।

--- डेव

पी।, रियलवर्ल्ड यूसेकेस (टीएम): मैंने एक ऐसे स्थान पर काम किया जहां कई ब्राउज़र क्लाइंट और जावा-आधारित सेवा के बीच एक जटिल जटिल (और स्पेगेटी-कोडेड) प्रोटोकॉल था। मैंने एक सुंदर मिठाई परीक्षण-दोहन लिखा जो उपयोग किया जाता था jsdom एन अनुरूपित ब्राउज़र होस्ट और इस्तेमाल करने के लिए नोड जावा जावा सेवा कोड के चारों ओर एक रैपर के रूप में। क्लाइंट के लिए जेएस में और सेवा के लिए जावा में परिवहन इंटरफेस को बाहर निकालना मुश्किल था, इसलिए जब भी इनमें से कोई भी चीज संदेश भेजती है, तो मैं इसे कैप्चर करता हूं और इच्छित लक्ष्य के लिए संभाव्य वितरण के लिए इसे कतार में चिपकाता हूं (यानी, मैंने नेटवर्क वर्चुअलाइज्ड किया)। इस तरह, मैं एक जावा सेवा के साथ और उसके माध्यम से बातचीत करने वाले कई ग्राहकों का एक पूर्ण-सिमुलेशन चला सकता हूं, और बिना किसी तार संचार के पूरी प्रक्रिया को एक ही प्रक्रिया में चला सकता हूं। और फिर मैं मजेदार सामान कर सकता हूं जैसे जानबूझकर संदेश वितरण को पुन: व्यवस्थित करना ताकि यह सुनिश्चित किया जा सके कि कोड समय बग के लिए लचीला था। और जब एक बग की खोज की गई, तो मेरे पास संदेश ऑर्डर लॉग किए गए और उन्हें बग को दोबारा बनाने के लिए पुन: पेश किया जा सकता था। ओह, और पूरी चीज स्थापित हुई और लॉगिंग की कुछ हज़ार लाइनों के साथ एक सुंदर जटिल परिदृश्य चलाया और 1 सेकंड प्रति रन के तहत समाप्त हो गया। 2 सप्ताह अच्छी तरह से खर्च किया। मजेदार चीजें।

रियलवर्ल्ड यूज केस # 2: सेलेनियम-inproc - एक मॉड्यूल जो सेलेनियमआरसी जेएआर फ़ाइल को लपेटता है ब्राउज़र स्वचालन परीक्षण w / सेलेनियम अभी तक एक और लोकलहोस्ट सेवा चलाने के बिना।


102
2018-02-19 20:14



यह सही जवाब होना चाहिए। - Ventura
क्या यह गुरुबी जैसे तीसरे पक्ष के पुस्तकालयों के साथ काम करता है? gurobi.com - Karthik Balakrishnan


संचार child_process द्वारा किया जा सकता है।

एक नई प्रक्रिया पैदा करें और एक मुख्य वर्ग निष्पादित करें। यह मुख्य वर्ग कंसोल पर आउटपुट लौट रहा है। तो डेटा नोड के लिए उपलब्ध है stdout dataघटना।

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 doco को खोजने की आवश्यकता है ...


0
2018-01-18 21:22



असल में, जेएनआई जावा से सिर्फ मूल कॉलिंग नहीं, बल्कि जेवीएम आमंत्रण को भी शामिल करता है। - Lawrence Dol
@ सॉफ़्टवेयर भिक्षु, आपका कथन काफी सही है, लेकिन क्यू के सीटीएक्स में, नोड जेएस को सभी डब्ल्यू / अपने सभी जावाविमों पर जेनी का उपयोग करके कल्पना करना मुश्किल है। - mP.


मुझे आश्चर्य है कि यह बिल्कुल संभव है। लेकिन अगर यह संभव है तो भी मुझे कल्पना है कि इसे लागू करना मुश्किल है और मुझे यकीन है कि किसी ने अभी तक ऐसा नहीं किया है।

एक का उपयोग करने के बारे में कैसे नामित पाइप प्रक्रियाओं (जावा और node.js) के बीच संवाद करने के लिए?


0
2018-01-18 22:09





मुझे लगता है कि आप जो खोज रहे हैं वह एक पुल के रूप में उपयोग करने के लिए एक मूल विस्तार है। यद्यपि मेरे पास जो भी कहा जा रहा है उसका उदाहरण नहीं है, मेरे पास एक उदाहरण है कि Node.JS का उपयोग करके C ++ एक्सटेंशन को कॉल करने का तरीका है।

https://github.com/jrgleason/NodeJSArduinoLEDController


0
2018-05-10 15:13





मुझे लगता है कि अनुमोदित उत्तर थोड़ा पुराना है। यह शायद कोशिश करने लायक है: https://github.com/joeferner/node-java


0
2017-10-23 04:31