java - जेएनआई के साथ स्थिर लाइब्रेरी लिंक करना




jni static-libraries (2)

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

मैं अपने जावा एप्लिकेशन में एक जेएनआई लाइब्रेरी को कैसे स्थाई रूप से लिंक कर सकता हूं?


जेईपी 178 में आप अपनी टिप्पणी में जुड़े हुए हैं, आपको कुछ भी अलग तरह से करने की ज़रूरत नहीं है। System.loadLibrary अब दोनों गतिशील और स्थैतिक पुस्तकालयों को लोड करेगा।

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

आपको शायद यह सुनिश्चित करने की आवश्यकता है कि आपका java.library.path सही ढंग से सेट है


जावा एसई 8 विनिर्देश को स्थैतिक जोड़ने का समर्थन करने के लिए बदल दिया गया है, और स्थिर लिंकिंग जेडीके में लागू किया गया है। इस पर सिस्टम.लोड लाइबरी के लिए संक्षिप्त वर्णन किया गया है। जेएनआई विनिर्देशों का वह भाग जो यहां संदर्भित है, यहां और यहां है

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

एक महत्वपूर्ण अंतर तरीका है कि स्थिर पुस्तकालयों को आरंभ किया जाता है। डायनेमिक लाइब्रेरीज JNI_OnLoad फ़ंक्शन को कॉल करके आरंभ किया JNI_OnLoad है और इसे जेएनआई_ऑनयूएलएलड फोन करके शुरू कर JNI_OnUnload । प्रत्येक गतिशील पुस्तकालय में इन फ़ंक्शंस का अपना स्वयं का संस्करण हो सकता है। यदि कई स्थैतिक रूप से लिंक किए गए पुस्तकालय हैं, तो स्पष्ट रूप से वे इन सभी नामों के साथ कार्य नहीं कर सकते हैं। एक स्थिर लाइब्रेरी नाम के लिए libname लोड / अनलोड फ़ंक्शन JNI_OnLoad_libname और JNI_OnUnload_libname

JNI_OnLoad_libname फ़ंक्शन को JNI_VERSION_1_8 या उससे अधिक का मान वापस करना होगा। यदि ऐसा नहीं है, तो JVM स्थैतिक पुस्तकालय की अनदेखी करेगा।

असल में, यदि आप System.loadLibrary("foo") , तो सिस्टम चल रहे निष्पादन योग्य छवि में फ़ंक्शन JNI_OnLoad_foo लिए देखता है, और यदि यह पाया जाता है, तो यह मानता है कि पुस्तकालय स्थैतिक रूप से लिंक है, और इसकी मूल विधियों को इसके भीतर खोजा जाता है छवि चल रहा है यदि JNI_OnLoad_foo नहीं मिला है, तो गतिशील पुस्तकालयों की सामान्य खोज और लोड हो रहा है, और मूल विधियों को गतिशील पुस्तकालय से जोड़ा जाता है ताकि पाया जा सके।







static-linking