2011-09-24 4 views
28

से जावा को कॉल करने का एक सुविधाजनक तरीका ढूंढना ऐसा लगता है कि जेएनआई (जावा नेटिव इंटरफेस) से संबंधित अधिकांश दस्तावेज या सहायक पुस्तकालय जावा से देशी कोड को कॉल करने के लिए चिंतित हैं। ऐसा लगता है कि यह इसका मुख्य उपयोग है, भले ही यह अधिक सक्षम हो।सी ++

मैं अधिकतर विपरीत दिशा में काम करना चाहता हूं: इसमें कुछ जावा पुस्तकालय जोड़कर मौजूदा (काफी बड़े) पोर्टेबल सी ++ प्रोग्राम को संशोधित करना चाहते हैं। उदाहरण के लिए, मैं इसे जेडीबीसी, या जेएमएस के माध्यम से संदेश कतार प्रणाली के माध्यम से कॉल डेटाबेस बनाना चाहता हूं, या ईमेल भेज सकता हूं, या अपने स्वयं के जावा क्लासेस इत्यादि कह सकता हूं, लेकिन कच्चे जेएनआई के साथ यह बहुत अप्रिय और त्रुटि-प्रवण है।

तो मैं आदर्श रूप से सी ++ कोड लिखना पसंद करूंगा जो जावा कक्षाओं को आसानी से कॉल कर सकता है जैसे सी ++/सीएलआई सीएलआर कक्षाओं को कॉल कर सकता है। की तरह कुछ:

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

यह पहले से ही मौजूद है, तो कृपया मुझे बताएँ!

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

+1

[SWIG] (http://www.swig.org/Doc1.3/Java.html) है, हालांकि मैंने इसे केवल सी और पायथन के लिए उपयोग किया है ... एक * लंबा * समय पहले। –

+0

अपडेट देखें: एसडब्ल्यूआईजी स्पष्ट रूप से ऐसा नहीं करता है। –

+0

जिसमें संकलक/दुभाषिया आप अपने प्रोग्राम, सी या जावा निष्पादित करना चाहते हैं? यदि जावा, जेएनआई का उपयोग कर रिवर्स संभव नहीं है। – Naved

उत्तर

16

हां, ऐसे मौजूदा उपकरण हैं जो वास्तव में ऐसा करते हैं - जावा कक्षाओं के लिए सी ++ रैपर उत्पन्न करते हैं। यह सी ++ में जावा एपीआई का उपयोग कम लागत और जोखिम के साथ अधिक पारदर्शी और आनंददायक है।

जिसने मैंने सबसे अधिक उपयोग किया है वह JunC++ion है। यह परिपक्व, शक्तिशाली और स्थिर है। प्राथमिक लेखक बहुत अच्छा है, और बहुत ही संवेदनशील है। दुर्भाग्यवश, यह एक वाणिज्यिक उत्पाद है, और मूल्यवान है।

Jace बीएसडी लाइसेंस के साथ एक नि: शुल्क, मुक्त स्रोत उपकरण है। पिछले कुछ वर्षों से मैंने जैस के साथ खेला था।ऐसा लगता है कि अभी भी कुछ सक्रिय विकास है। (मुझे अभी भी एक साल पहले मूल लेखक द्वारा यूएसनेट पोस्ट याद है, मूल रूप से वही प्रश्न पूछना जो आप पूछ रहे हैं।)

यदि आपको जावा से सी ++ में कॉलबैक का समर्थन करने की आवश्यकता है, तो यह सी ++ कक्षाओं को परिभाषित करने में मददगार है जावा इंटरफेस लागू करें। कम से कम जूनसी ++ आयन आपको ऐसी सी ++ कक्षाएं जावा विधियों को पास करने की अनुमति देता है जो कॉलबैक लेते हैं। पिछली बार जब मैंने जैस की कोशिश की, तो इसका समर्थन नहीं हुआ - लेकिन वह सात साल पहले था।

+0

धन्यवाद। मैं जेस स्रोत से देखता हूं कि यह हर संदर्भ को वैश्विक में बदल देता है! यह एक अच्छा विचार नहीं है। जेएनआई जानबूझकर यह विकल्प बनाता है: स्थानीय लोगों की तुलना में ग्लोबल अधिक हेवीवेट होते हैं, और वास्तविक कार्यक्रम में चर के अधिकांश बहुमत स्थानीय होते हैं। किसी भी विनाशक में स्थानीय लोगों को "रिलीज़" होने की आवश्यकता नहीं है क्योंकि JVM इसका ख्याल रखता है। 'पुशलोकलफ्रेम'/'पॉपलोकलफ्रेम' को समाहित करने के लिए आपको केवल एक आरएआईआई कक्षा की आवश्यकता है। जूनसी ++ आयन उस के लिए क्या दृष्टिकोण लेता है? –

+2

बीटीडब्लू 'सी ++ जावा जेएनआई रैपर' शब्द के लिए मेरी Google खोज के साथ, अब मैं देखता हूं कि जूनसी ++ आयन परिणाम के 22 पृष्ठ पर है! अभी तक जेस नहीं देखा है ... –

+0

जूनसी ++ आयन पेज 1 पर होगा, अगर खोज गुणवत्ता पर आधारित थी। मेरे पास अभी जूनसी ++ आयन तक पहुंच नहीं है। मुझे लगता है कि कुछ मामलों में वैश्विक संदर्भ आवश्यक हैं और दूसरों के लिए पर्याप्त हैं, लेकिन यह सिर्फ एक अनुमान है। मैं देखूंगा कि क्या मैं लेखक को जवाब देने के लिए प्राप्त कर सकता हूं। –

1

आलेख Java Tip 17: Integrating Java with C++ वर्णन करता है कि इसे विस्तार से कैसे किया जाए।

+2

अच्छा अनुमान है, लेकिन यह लेख 1 99 6 से है (यह उल्लेख करता है कि वैश्विक संदर्भों को पकड़ने का कोई तरीका नहीं है! यह बहुत समय पहले 1.2 में जोड़ा गया था)। इसके अलावा लेख में वर्णन किया गया है कि हाथ से जेएनआई आमंत्रण कोड कैसे लिखना है, यही वह चीज है जिसे मैं कोड-जनरेशन टूल के साथ करने से बचना चाहता हूं। –

+0

+1, अच्छी चीजें। – Naved

2

जावा को सी ++ से कॉल करना।

आप जो भी चाहते हैं वह कर सकते हैं लेकिन आपको जावा को नियंत्रण में रखना चाहिए। इसका मतलब यह है कि आप जावा थ्रेड बनाते हैं जो मूल कोड में कॉल करते हैं और वहां से वे ब्लॉक करते हैं, आपके मूल कोड के लिए कुछ ऐसा करने के लिए प्रतीक्षा करते हैं। आप कई जावा थ्रेड बनाते हैं क्योंकि आपको पर्याप्त काम/थ्रूफूट करने की आवश्यकता होती है।

तो आपका सी ++ एप्लिकेशन शुरू होता है, यह एक जेवीएम/जावावीएम बनाता है (दस्तावेज के अनुसार, उदाहरण नीचे qtjambi codebase में मौजूद है), यह बदले में सामान्य जेएनआई प्रारंभिकरण और System.loadLibrary() करता है और JARs प्रदान करता है "देशी" संबंध के साथ। फिर आप धागे का एक गुच्छा शुरू करते हैं और कुछ जेएनआई कोड (जिसे आपने बनाया) कहते हैं, जहां वे आपके सी ++ कोड के इंतजार में अवरुद्ध कर सकते हैं ताकि उन्हें कुछ काम करने के लिए कहा जा सके।

आपका सी ++ कोड (किसी अन्य थ्रेड से अनुमानित रूप से) तब सेट हो जाता है और ब्लॉक थ्रेड श्रमिकों में से किसी एक को अवरुद्ध और प्रतीक्षा करने वाली सभी जानकारी पास करता है, फिर इसे चलाने के लिए आदेश दिया जाता है, फिर यह शुद्ध- काम करने के लिए जावा कोड और परिणाम के साथ वापसी।

...

यह सेटअप करने के लिए संभव है और बना सकते हैं और सी ++ कोड से एक JavaVM उदाहरण होते हैं। यह आपके सीएलएसपीएटीएच/जेएआर को आपके सी ++ प्रोग्राम के अंदर encapsulated आवश्यक वातावरण स्थापित करने के लिए मजबूर किया जा सकता है। इस बात का

रूपरेखा के रूप में मुझे यकीन है कि आप http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/invocation.html

में पहले से ही पाया है ...

सी ++ => जावा JNI QtJambi परियोजना में जनरेटर का एक प्रकार है (है कि मैं पर काम करते हैं और मदद बनाए रखने में मदद करें)। यह क्यूटी टूलकिट के लिए काफी bespoke है, लेकिन अनिवार्य रूप से यह C++ .cpp/ .h फ़ाइलों और * .java फ़ाइल के संग्रह में सी ++ हेडर फ़ाइलों का एक समूह का अनुवाद करता है ताकि ऑब्जेक्ट की लिंकेज और खोल रोकथाम प्रदान किया जा सके ताकि प्रतिस्पर्धी स्मृति आवंटन योजनाएं एक साथ अच्छी तरह से खेलते हैं। शायद इससे कुछ लिया जाना है।

यह निश्चित रूप से जेनरेटर से पूछे जाने वाले प्रश्नों के लिए एक प्रमाण है जो कि क्यूटीजंबी परियोजना में निहित होता है (लेकिन कुछ काम के साथ स्वतंत्र हो सकता है) और यह एलजीपीएल लाइसेंस प्राप्त (ओपन-सोर्स) है। क्यूटी टूलकिट एक छोटा एपीआई नहीं है, फिर भी यह एपीआई के उच्च% (> 85% और लगभग 100% कोर/जीयूआई भागों) को कवर करने के लिए 100 वर्गों को उत्पन्न कर सकता है।

HTH

+0

धागे के बारे में आपके उत्तर का हिस्सा मुझे कोई समझ नहीं आता है। मैं शुद्ध जेएनआई का उपयोग कर पहले से कहीं ज्यादा सरल कर सकता हूं। मैं बस जेवीएम में प्रवेश करता हूं, पूछता हूं कि मुझे एक वर्ग लोड करें, उस पर निर्माता को कॉल करें, इसकी विधियों को कॉल करें। यही सब है इसके लिए। –

+0

QtJambi लाइब्रेरी एक प्रोजेक्ट है जो जावा कोड को क्यूटी लाइब्रेरी का उपयोग करने की इजाजत देता है, यानी जावा कॉलिंग सी ++। क्या यह मौजूदा जावा कक्षाओं को पढ़ता है और संबंधित सी ++ रैपर वर्गों का उत्पादन करता है ताकि जावा कक्षाओं को आसानी से सी ++ से बुलाया जा सके? –

+1

थ्रेड समस्या एक प्रक्रिया को सेटअप करने के तरीके के बारे में था ताकि सी ++ किसी भी समय जावा में सुरक्षित रूप से कॉल कर सके। क्यूटी लाइब्रेरी के भाग जटिल हैं, यह एक सी ++ लाइब्रेरी है जिसे जावा में वापस कॉल करने की भी आवश्यकता है। आप कॉलबैक/ईवेंट हैंडलर/थ्रेड पंजीकृत कर सकते हैं जो सी ++ में चलते हैं लेकिन फिर कभी-कभी जावा में चीजों को आमंत्रित करते हैं। जावा में शुद्ध-जावा और सी/सी ++ में एपीआई हैं। लेकिन सी/सी ++ में जावा में चीजें करने के लिए कोई एपीआई नहीं है। जब जावा में पहले से ही सी ++ एपीआई (यानी जेएनआई) है तो जावा चीजों का सी ++ रैपर बनाने का कोई मतलब नहीं है। –

0

हो सकता है कि यह नाखून के लिए एक बहुत बड़ा हथौड़ा का एक सा है, लेकिन यह क्या CORBA के लिए बनाया गया था नहीं है?

+3

उस लिंक से: "सी ++ मैपिंग कुख्यात रूप से कठिन है; मैपिंग के लिए प्रोग्रामर को जटिल और भ्रमित डेटाटाइप सीखने की आवश्यकता होती है जो सी ++ मानक टेम्पलेट लाइब्रेरी को भविष्यवाणी करता है" बहुत अच्छा लगता है! :) –

0

चूंकि कोर्बा आप जो चाहते हैं वह प्रतीत नहीं होता है, यहां लिंक दिए गए हैं कि सी/सी ++ से जेवीएम कैसे शुरू करें और जावा-विधियों को कॉल करें।

http://java.sun.com/docs/books/jni/html/invoke.html और http://java.sys-con.com/node/45840

पुनश्च: जब सी के साथ जावा इंटरफ़ेस ++ आप भी JNA या bridj पर एक नजर है चाहिए।

+0

देर हो रही है। दोनों लिंक सिर्फ वही जानकारी प्रदान करते हैं जैसा कि पहले से ही दूसरों द्वारा दिया गया है ... शुभ रात्रि :) – Axel

1

मैं भी कई कठिनाइयों JNI हो रही विभिन्न ऑपरेटिंग सिस्टम पर काम करने के लिए, 32/64-बिट आर्किटेक्चर के साथ मुकाबला करने और सुनिश्चित करें कि सही साझा पुस्तकालयों पाए गए और लोड रही थी। मुझे कोर्बा (एमआईसीओ और जैकोरबी) भी उपयोग करना मुश्किल लगता है।

मैं के रूप में या तो मेरी जावा कोड को चलाने के लिए इस स्थिति में जावा और मैं अपनी पसंदीदा समाधान में सी/C++ से कॉल करने के लिए कर रहे हैं कोई प्रभावी रास्ता मिल गया:

  1. एक स्टैंड-अलोन प्रोग्राम है कि मैं यह कर सकते हैं java -cp myjar.jar org.foo.MyClass के साथ आसानी से सी/सी ++ प्रोग्राम से चलाएं। मुझे लगता है कि यह आपकी स्थिति के लिए बहुत सरल है।

  2. एक मिनी सर्वर के रूप में, इस सॉकेट के माध्यम से C/C++ एक टीसीपी/आईपी सॉकेट पर कार्यक्रमों और परिणाम देने से अनुरोध स्वीकार कर भी। इसके लिए नेटवर्किंग और धारावाहिक कार्यों को लिखना आवश्यक है लेकिन सी/सी ++ और जावा प्रक्रियाओं को डीक्यूल्स करता है और आप स्पष्ट रूप से सी ++ पक्ष या जावा पक्ष में होने वाली किसी भी समस्या की पहचान कर सकते हैं।

  3. टॉमकैट में एक सर्वलेट के रूप में और मेरे सी/सी ++ प्रोग्राम (अन्य सर्वलेट कंटेनर भी काम करेंगे) से HTTP अनुरोध करते हैं। यह नेटवर्किंग और क्रमबद्ध कार्यों को लिखने की भी आवश्यकता है। यह एसओए की तरह अधिक है।

+0

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

+0

इस बीच, जेएनआई एकदम सही हल्के समाधान होगा, अगर केवल प्रत्येक विधि कॉल के लिए incantation (विधि नाम और हस्ताक्षर पास करें, आईडी कैश किया गया है, 'कॉल [स्टेटिक] विधि टी' का सही स्वाद निर्धारित करें, अपवादों की जांच करें) हो सकता है साफ स्वचालित मुझे यही सब चाहिए था। –

+0

एक और वाणिज्यिक उत्पाद: http://www.javain.com/javain/oojni.jsp?cat=oojni&sub=whatIs –

1

Thrift या Protocol Buffers का उपयोग कर सी ++ कॉल करने के लिए अपने जावा की सुविधा के लिए के बारे में क्या?

+0

मुझे आरपीसी का उपयोग कर प्रक्रियाओं के बाहर सर्वर से बाहर निकलने के लिए मेरा प्रश्न अपडेट करना चाहिए। –

0

मेरे अपने प्रश्न का उत्तर देना:

http://java4cpp.kapott.org/

एक सक्रिय परियोजना प्रतीत नहीं होता। लेखक ने सिफारिश की है कि इसका उपयोग जेडीके 1.5 या बाद में नहीं किया जाए।

यह एक गंभीर समस्या है करने के लिए प्रकट होता है: यह अपने आवरण वस्तुओं के लिए चारों ओर नग्न संकेत गुजरता है:

java::lang::Integer* i = new java::lang::Integer("10"); 

delete i; // don't forget to do this! 

यह भी एक और अधिक सूक्ष्म समस्या का कारण बनता है कि आदेश असाइनमेंट अनुकूलता (जैसे एक उप-प्रकार के रूप में एक वर्ग का प्रतिनिधित्व करने के लिए इंटरफ़ेस का यह लागू होता है) रैपर को एक दूसरे से उत्तराधिकारी होना होता है।

7

मैं जूनसी ++ आयन समेत कोडेमेश के भाषा एकीकरण उत्पादों के लिए प्रिंसिपल आर्किटेक्ट्स में से एक हूं। हम 1 999 से इस तरह के एकीकरण कर रहे हैं और यह वास्तव में अच्छी तरह से काम करता है। सबसे बड़ी समस्या जेएनआई भाग नहीं है। जेएनआई डिबग करने के लिए कठिन और कठिन है, लेकिन एक बार जब आप इसे सही मानते हैं, तो यह ज्यादातर काम करता रहता है। प्रत्येक अब और फिर, आप एक जेवीएम या ओएस अपडेट से टूट जाते हैं, और फिर आपको अपने उत्पाद को ठीक-ठीक करना होगा, लेकिन सामान्य रूप से यह स्थिर है।

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

हमने यह भी पाया कि आप वास्तव में एकीकरण विनिर्देश बनाने के लिए लोगों को एक जीयूआई-आधारित कोड जेनरेटर देना चाहते हैं। एक बार जब उन्होंने इसे निर्दिष्ट कर लिया है, तो आप इसे रात के निर्माण में एकीकृत करने के लिए सीएलआई संस्करण का उपयोग करते हैं।

आपकी परियोजना के साथ शुभकामनाएँ। सही होने के लिए यह बहुत काम है। हमने इस पर कई सालों बिताए और हम अभी भी इसे नियमित रूप से बेहतर बना रहे हैं।

+0

धन्यवाद।पुन: डिफ़ॉल्ट की समझदार पसंद, मैं पूरी तरह से सहमत हूं - यह डिजाइन आईएमओ के बारे में सबसे महत्वपूर्ण बात है। मेरे वर्तमान प्रोजेक्ट के लिए, स्थानीय लोगों का उपयोग करने का विकल्प महत्वपूर्ण होगा, और साझा डेटा अल्पसंख्यक होगा, इसलिए मैं 'जावा :: लैंग :: स्ट्रिंग' और 'वैश्विक <जावा :: लैंग :: स्ट्रिंग> 'क्रमशः स्थानीय और ग्लोबल्स के लिए वाक्यविन्यास के रूप में। –

3

मेरे पास बहुत ही समस्याएं थीं, इसे अपने आप कर रही थी, शायद यह किसी की मदद करेगी।

https://github.com/mo22/jnipp

यह एक छोटा सा क्रम पदचिह्न (< 30kb) है संदर्भ का प्रबंधन करता है, और जावा वर्ग इंटरफेस पैदा करने का समर्थन करता है। आईई। LocalRef> stringArray; और फिर stringArray [1] -> getBytes() या कुछ का उपयोग कर।