2009-07-15 17 views
13

मेरे पास कई कक्षाएं हैं जो "जेनी" नामक एक ही जेएनआई लाइब्रेरी का उपयोग करती हैं। उन वर्गों में से प्रत्येक में, मैं वर्ग के स्थिर प्रारंभकर्ता में एक System.loadLibrary() कॉल है:जावा को लाइब्रेरी को लोड करने से रोकें

Class class1 { 
    static{ 
     System.loadLibrary("jni"); 
    } 
    ... 
} 

Class class2 { 
    static{ 
     System.loadLibrary("jni"); 
    } 
    ... 
} 

केवल समस्या यह है, मैं केवल चाहते System.loadLibrary(), एक बार कहे जाने के बाद से यह ले जा सकते हैं कुछ समय। क्या एक ही लाइब्रेरी के एकाधिक लोडिंग को रोकने के लिए कोई आसान और साफ तरीका है?

उत्तर

30

यदि लाइब्रेरी पहले ही लोड हो चुकी है तो उसी लाइब्रेरी को लोड करने के लिए किसी भी अगली कॉल को अनदेखा कर दिया जाएगा।

System.loadLibrary:

libname तर्क द्वारा निर्दिष्ट प्रणाली पुस्तकालय लोड करता है। में जिस तरह से लाइब्रेरी नाम वास्तविक सिस्टम लाइब्रेरी में मैप किया गया है, सिस्टम निर्भर है।

भार निर्दिष्ट पुस्तकालय नाम के साथ गतिशील पुस्तकालय:

कॉल System.loadLibrary (नाम) प्रभावी रूप से कॉल

Runtime.getRuntime().loadLibrary(name) 

Runtime.loadLibrary के बराबर है। एक फ़ाइल जिसमें देशी कोड है से स्थानीय फ़ाइल सिस्टम से लोड किया गया है जहां पुस्तकालय फ़ाइलें पारंपरिक रूप से प्राप्त की जाती हैं। इस प्रक्रिया का विवरण कार्यान्वयन-निर्भर हैं। लाइब्रेरी नाम से विशिष्ट फ़ाइल नाम सिस्टम-विशिष्ट तरीके से किया जाता है।

सबसे पहले, यदि कोई सुरक्षा प्रबंधक है, इसकी चेकलिंक विधि libname को इसके तर्क के रूप में बुलाया जाता है। यह परिणामस्वरूप एक सुरक्षा अपवाद हो सकता है।

विधि System.loadLibrary (स्ट्रिंग) परंपरागत और सुविधाजनक इस विधि का आह्वान करने का माध्यम है।

static { System.loadLibrary("LibFile"); } 
: देशी तरीकों एक वर्ग के कार्यान्वयन में प्रयोग की जाने वाली हैं, तो एक मानक रणनीति देशी कोड किसी स्थिर प्रारंभकर्ता डाल करने के लिए तो एक पुस्तकालय फ़ाइल (यह LibFile कहते हैं) और में डालने के लिए है कक्षा घोषणा के भीतर

। जब कक्षा लोड और प्रारंभ की जाती है, तो देशी विधियों के लिए आवश्यक मूल कोड कार्यान्वयन तब लोड हो जाएगा।

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

+0

हाँ - आपको यह मिला :) –

+1

क्या यह System.load के लिए भी सच है? दस्तावेज़ किसी भी तरह से निर्दिष्ट नहीं करते हैं। –

+0

हां। यह System.load के लिए भी सच है। –

0

मैं यकीन है कि लोड करने के लिए बाद में किसी भी कॉल एक पहले से ही भरी हुई पुस्तकालय कोई प्रभाव [उद्धरण वांछित] है हूँ।

यह ClassLoader वर्ग स्रोत कोड में सत्यापित किया गया था, लेकिन मैं अभी भी इस के लिए एक अच्छा स्रोत खोजने की कोशिश कर रहा हूँ।

0

एक सिंगलटन वर्ग जो लोड "JNI" केवल के दौरान यह पहली इन्स्टेन्शियशन है बनाएँ, और से JavaDocs Class1 में इस सिंगलटन फोन और System.loadLibrary ("JNI") के बजाय Class2

2

-

यदि इस विधि को एक ही लाइब्रेरी नाम के साथ एक से अधिक बार बुलाया जाता है, तो दूसरी और बाद की कॉलों को अनदेखा कर दिया जाता है।

संबंधित मुद्दे