java - शहर - यूपी के जिला फर्रुखाबाद की ताजा जानकारी




देशी कोड को कॉल करने के लिए जेएनए के बजाय जेएनआई का प्रयोग करें? (6)

जेएनए जेएनआई की तुलना में देशी कोड को कॉल करने के लिए उपयोग करने के लिए थोड़ा आसान लगता है। जेएनए पर आप जेएनआई का किस मामले में उपयोग करेंगे?


  1. कुछ साल पहले आप जेएनए से पहले कोड लिख रहे थे या प्री 1.4 जेआरई को लक्षित कर रहे हैं।
  2. जिस कोड के साथ आप काम कर रहे हैं वह डीएलएल \ SO में नहीं है।
  3. आप कोड पर काम कर रहे हैं जो एलजीपीएल के साथ असंगत है।

यही वह है जो मैं अपने सिर के ऊपर से ऊपर आ सकता हूं, हालांकि मैं या तो एक भारी उपयोगकर्ता नहीं हूं। ऐसा लगता है कि आप जेएनए से बच सकते हैं यदि आप उनके द्वारा प्रदान किए गए एक से बेहतर इंटरफ़ेस चाहते थे लेकिन आप जावा में इसके आसपास कोड कर सकते थे।


  1. जेएनए सी ++ कक्षाओं के मैपिंग का समर्थन नहीं करता है, इसलिए यदि आप सी ++ लाइब्रेरी का उपयोग कर रहे हैं तो आपको एक जेनी रैपर की आवश्यकता होगी
  2. अगर आपको बहुत सारी मेमोरी कॉपी करने की ज़रूरत है। उदाहरण के लिए, आप एक विधि को कॉल करते हैं जो आपको एक बड़ा बाइट बफर देता है, आप इसमें कुछ बदलते हैं, फिर आपको इस बाइट बफर का उपयोग करने वाली दूसरी विधि को कॉल करने की आवश्यकता होती है। इसके लिए आपको इस बफर को सी से जावा में कॉपी करने की आवश्यकता होगी, फिर इसे वापस जावा से सी में कॉपी करें। इस मामले में जेनी प्रदर्शन में जीतेंगे क्योंकि आप प्रतिलिपि के बिना सी में इस बफर को रख और संशोधित कर सकते हैं।

ये समस्याएं हैं जिनसे मुझे सामना करना पड़ा है। शायद और भी है। लेकिन सामान्य प्रदर्शन में जेना और जेनी के बीच यह अलग नहीं है, इसलिए जहां भी आप जेएनए का उपयोग कर सकते हैं, इसका इस्तेमाल करें।

संपादित करें

यह जवाब काफी लोकप्रिय प्रतीत होता है। तो यहां कुछ जोड़ दिए गए हैं:

  1. यदि आपको सी ++ या COM को मैप करने की आवश्यकता है, तो ओलिवर चाफिक, जेएनएनेटर के निर्माता, जिसे BridJ कहते हैं, द्वारा एक लाइब्रेरी है। यह अभी भी एक युवा पुस्तकालय है, लेकिन इसमें कई रोचक विशेषताएं हैं:
    • गतिशील सी / सी ++ / COM इंटरऑप: सी ++ विधियों को कॉल करें, सी ++ ऑब्जेक्ट्स बनाएं (और जावा से सबक्लास सी ++ कक्षाएं बनाएं!)
    • जेनेरिक के अच्छे उपयोग के साथ सीधे प्रकार के मैपिंग (प्वाइंटर्स के लिए बहुत अच्छे मॉडल सहित)
    • पूर्ण जेएनएटरेटर समर्थन
    • विंडोज, लिनक्स, मैकोज़ एक्स, सोलारिस, एंड्रॉइड पर काम करता है
  2. स्मृति प्रतिलिपि के लिए, मेरा मानना ​​है कि जेएनए सीधे बाइटबफर का समर्थन करता है, इसलिए स्मृति प्रतिलिपि से बचा जा सकता है।

इसलिए, मुझे अभी भी विश्वास है कि जहां भी संभव हो, जेएनए या ब्रिजजे का उपयोग करना बेहतर है, और यदि प्रदर्शन महत्वपूर्ण है तो jni पर वापस जाएं, क्योंकि यदि आपको अक्सर मूल कार्यों को कॉल करने की आवश्यकता होती है, तो प्रदर्शन हिट ध्यान देने योग्य है।


जब तक मुझे कुछ याद नहीं आ रहा है, जेएनए बनाम जेएनआई के बीच मुख्य अंतर नहीं है कि जेएनए के साथ आप देशी कोड (सी) कोड से जावा कोड नहीं कॉल कर सकते हैं?


मैंने प्रदर्शन तुलना के लिए जेएनआई और जेएनए की जांच की क्योंकि हमें परियोजना में एक डीएल कॉल करने के लिए उनमें से एक को तय करने की आवश्यकता थी और हमारे पास वास्तविक समय बाधा थी। परिणामों से पता चला है कि जेएनआई के पास जेएनए (लगभग 40 गुना) से अधिक प्रदर्शन है। शायद जेएनए में बेहतर प्रदर्शन के लिए एक चाल है लेकिन यह एक साधारण उदाहरण के लिए बहुत धीमी है।


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

native "C++" void printHello() {
    const char* helloWorld = "Hello, World!";
    `System.out.println(#$(helloWorld));`
}

जेनेट फिर बैकटिक-एम्बेडेड जावा को उपयुक्त जेएनआई कॉल में अनुवादित करता है।


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

असल में, मुझे निश्चित रूप से लगता है कि मैंने जेएनआई के बजाय जेएनए का इस्तेमाल किया होगा जब मुझे वास्तव में जेएनआई (जो उबाऊ विकास प्रक्रिया है) से सरल दिखता था। बहुत बुरा, इस समय जेएनए जारी नहीं किया गया था।





jna