से जावा को कॉल करने का एक सुविधाजनक तरीका ढूंढना ऐसा लगता है कि जेएनआई (जावा नेटिव इंटरफेस) से संबंधित अधिकांश दस्तावेज या सहायक पुस्तकालय जावा से देशी कोड को कॉल करने के लिए चिंतित हैं। ऐसा लगता है कि यह इसका मुख्य उपयोग है, भले ही यह अधिक सक्षम हो।सी ++
मैं अधिकतर विपरीत दिशा में काम करना चाहता हूं: इसमें कुछ जावा पुस्तकालय जोड़कर मौजूदा (काफी बड़े) पोर्टेबल सी ++ प्रोग्राम को संशोधित करना चाहते हैं। उदाहरण के लिए, मैं इसे जेडीबीसी, या जेएमएस के माध्यम से संदेश कतार प्रणाली के माध्यम से कॉल डेटाबेस बनाना चाहता हूं, या ईमेल भेज सकता हूं, या अपने स्वयं के जावा क्लासेस इत्यादि कह सकता हूं, लेकिन कच्चे जेएनआई के साथ यह बहुत अप्रिय और त्रुटि-प्रवण है।
तो मैं आदर्श रूप से सी ++ कोड लिखना पसंद करूंगा जो जावा कक्षाओं को आसानी से कॉल कर सकता है जैसे सी ++/सीएलआई सीएलआर कक्षाओं को कॉल कर सकता है। की तरह कुछ:
using namespace java::util::regex; // namespaces mapped
Pattern p = Pattern.compile("[,\\s]+");
array<java::lang::String> result =
p.split("one,two, three four , five");
for (int i=0; i < result.length(); i++)
std::cout << result[i] << std::endl;
इस तरह, मैं manually do the work of getting the method ID by passing the name and the weird signature strings करने की जरूरत नहीं है, और तरीकों फोन करने के लिए अनियंत्रित एपीआई की वजह से प्रोग्रामिंग त्रुटियों से संरक्षित किया जाएगा। वास्तव में यह समकक्ष जावा की तरह दिखता है।
एनबी। मैं अभी भी जेएनआई का उपयोग करने के बारे में बात कर रहा हूँ! अंतर्निहित तकनीक के रूप में यह मेरी आवश्यकताओं के लिए बिल्कुल सही है। यह "प्रक्रिया में" और अत्यधिक कुशल है। मैं जावा को एक अलग प्रक्रिया में नहीं चलाना चाहता हूं और आरपीसी कॉल कर सकता हूं। जेएनआई स्वयं ठीक है। मैं बस इसके लिए एक सुखद इंटरफेस चाहता हूँ।
मेरे द्वारा निर्दिष्ट जावा कक्षाओं के एक सेट द्वारा प्रकट किए गए मिलान से सटीक मिलान करने के लिए समकक्ष सी ++ कक्षाएं, नामस्थान, विधियां इत्यादि बनाने के लिए कोड जनरेशन टूल होना होगा। उत्पन्न सी ++ कक्षाएं:
- सदस्य कार्य हैं जो उनके पैरामीटर के समान-लिपटे संस्करण स्वीकार करते हैं और फिर कॉल करने के लिए आवश्यक जेएनआई वूडू करते हैं।
- वैसे ही वापसी मूल्यों को लपेटें ताकि मैं प्राकृतिक तरीके से चेन कॉल कर सकूं।
- प्रत्येक बार उन्हें देखने से बचने के लिए विधि आईडी के प्रति-वर्ग स्थिर कैश को बनाए रखें।
- पूरी तरह से थ्रेड-सुरक्षित, पोर्टेबल, ओपन सोर्स बनें।
- स्वचालित रूप से प्रत्येक विधि कॉल के बाद अपवादों की जांच करें और एक std C++ अपवाद उत्पन्न करें।
- जब भी मैं सामान्य जेएनआई तरीके से देशी तरीकों को लिख रहा हूं, तब भी काम करता हूं लेकिन मुझे अन्य जावा कोड पर कॉल करने की आवश्यकता है।
- सरणी को आदिम प्रकारों और कक्षाओं के बीच पूरी तरह से लगातार काम करना चाहिए।
- इसमें कोई संदेह नहीं होगा कि वैश्विक संदर्भ फ्रेम के बाहर जीवित रहने की आवश्यकता होने पर संदर्भों को लपेटने के लिए ग्लोबल की तरह कुछ की आवश्यकता होगी - फिर, सभी सरणी/ऑब्जेक्ट संदर्भों के लिए समान कार्य करना चाहिए।
क्या ऐसा एक मुक्त, मुक्त स्रोत, पोर्टेबल लाइब्रेरी/उपकरण मौजूद है या क्या मैं सपना देख रहा हूं?
नोट: मैं this existing question पाया लेकिन इस मामले में ओपी पूर्णता की मांग कर के रूप में मैं जा रहा हूँ के रूप में लगभग नहीं था ...
अद्यतन: बड़ा घूँट के बारे में एक टिप्पणी मुझे this previous question सामने आये, जो लगता है इंगित करता है कि यह ज्यादातर विपरीत दिशा के बारे में है और इसलिए जो भी मैं चाहता हूं वह नहीं करेगा।
महत्वपूर्ण
- यह सी ++ कोड है कि जावा वर्गों और वस्तुओं manipulates लिखने के लिए है, न कि इसका उल्टा (शीर्षक देख!)
- मैं पहले से ही पता है कि JNI मौजूद है में सक्षम होने के बारे में है (सवाल देखें!) लेकिन जेएनआई एपीआई को हाथ से लिखित कोड अनावश्यक रूप से वर्बोज़, दोहराव, त्रुटि-प्रवण, संकलन समय पर टाइप-चेक नहीं किया गया है। यदि आप विधि आईडी और कक्षा ऑब्जेक्ट्स को कैश करना चाहते हैं तो यह और भी वर्बोज़ है। मैं स्वचालित रूप से सी ++ रैपर कक्षाएं उत्पन्न करना चाहता हूं जो मेरे लिए यह सब कुछ ख्याल रखे।
अद्यतन: मैं अपने खुद के समाधान पर काम शुरू कर दिया है:
https://github.com/danielearwicker/cppjvm
यह पहले से ही मौजूद है, तो कृपया मुझे बताएँ!
एनबी। यदि आप अपनी परियोजना में इसका उपयोग करने पर विचार कर रहे हैं, तो नि: शुल्क महसूस करें, लेकिन ध्यान रखें कि अभी कोड कुछ घंटों पुराना है, और मैंने अभी तक केवल तीन बहुत ही अनावश्यक परीक्षण लिखे हैं।
[SWIG] (http://www.swig.org/Doc1.3/Java.html) है, हालांकि मैंने इसे केवल सी और पायथन के लिए उपयोग किया है ... एक * लंबा * समय पहले। –
अपडेट देखें: एसडब्ल्यूआईजी स्पष्ट रूप से ऐसा नहीं करता है। –
जिसमें संकलक/दुभाषिया आप अपने प्रोग्राम, सी या जावा निष्पादित करना चाहते हैं? यदि जावा, जेएनआई का उपयोग कर रिवर्स संभव नहीं है। – Naved