2010-03-31 14 views
6

पृष्ठभूमिमैक ओएस एक्स पर जेएनआई लिब लोड हो रहा है?

तो मैं रनटाइम पर मैक ओएस एक्स पर एक jnilib (विशेष रूप से JOGL) जावा में लोड करने का प्रयास कर रहा हूँ। मैं प्रासंगिक स्टैक ओवरफ़्लो सवालों के साथ निम्नलिखित किया गया है:

मेरे लिए अंतिम लक्ष्य एक जार में मंच विशिष्ट JOGL फ़ाइलें पैकेज और उन्हें अनज़िप करने के लिए है एक अस्थायी निर्देशिका में और स्टार्ट-अप पर उन्हें लोड करें।

File f = new File("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl.jnilib"); 
    System.load(f.toString()); 
    f = new File ("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl_awt.jnilib"); 
    System.load(f.toString()); 

मैं निम्नलिखित अपवाद है जब JOGL एपीआई का उपयोग करने का प्रयास कर पाने: मैं बस JOGL हार्ड-कोडेड पथ का उपयोग कर लोड करने का प्रयास करने के लिए वापस मेरी समस्या काम किया

Exception in thread "main" java.lang.UnsatisfiedLinkError: no jogl in java.library.path 

लेकिन जब मैं द्वारा java.library.path निर्दिष्ट निम्नलिखित JVM विकल्प जोड़ना:

-Djava.library.path="/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/" 

सब कुछ ठीक काम करता है।


प्रश्न

यह संभव उपयोग System.load (या कुछ अन्य संस्करण) मैक ओएस एक्स पर -Djava.library.path के लिए एक स्थानापन्न जो रनटाइम पर शुरू हो जाती है के रूप में है?

उत्तर

1

जोग हमेशा सभी निर्भर पुस्तकालयों को स्वतः लोड करने का प्रयास करता है। इससे बचने के लिए, एक मूल LibLoader क्लास होना चाहिए जहां आप system.load()

+0

स्वीट! इसके लिए धन्यवाद, पुस्तकालयों को मैन्युअल रूप से लोड करने से पहले मूल LibLoader.disableLoading() को कॉल करना शानदार ढंग से काम करता है। – Clinton

-3

System.load(...) पुस्तकालय नाम तर्क के रूप में लेता है। यह पुस्तकालय के लिए तर्क के रूप में पथ नहीं लेता है। JVM -Djava.library.path;

में निर्दिष्ट निर्दिष्ट नाम वाले लाइब्रेरी की खोज करता है, यहां मैक ओएस एक्स के लिए कुछ भी विशिष्ट नहीं है। यह सभी ऑपरेटिंग सिस्टम पर उसी तरह पुस्तकालयों की खोज करता है।

+2

के माध्यम से पुस्तकालयों को लोड करने से पहले अक्षम लोडिंग() को कॉल कर सकते हैं, वास्तव में गलत है, System.load() पूरी फ़ाइल नाम लेगा और System.loadLibrary lib नाम ले जाएगा – sreejith

+0

मुझे लगता है कि लोडिंग jnilib मैक विशिष्ट है (यह मेरे मामले में है)। मैं लिनक्स (.so) पर काम कर रहा हूं, संकलन के बाद मैक में jnilib लोड नहीं होता है। मैं एमवीएन जेट्टी का उपयोग करता हूं: तैनाती-युद्ध-डीजावा.library.path =/path/to/jnilib। मैंने System.setProperty ("mylib.systemclassloader", "false") का भी उपयोग किया है; ताकि यह एक सर्वलेट वातावरण में चलाएगा (यह उस लाइब्रेरी की स्वचालित लोडिंग को अक्षम करता है)। कारण क्या हो सकता है? – Pramod

2

आपको स्टार्टअप पर java.library.path प्रदान करने की आवश्यकता नहीं है। आप प्रोग्राम

System.setProperty("java.library.path", "/var/folder/bla/foo/bar/"); 

साथ सेट कर सकते हैं मैं अगर System.load() इस लाइब्रेरी पथ के बिना किसी भी तरह काम करेंगे पता नहीं है।

+1

सुझाव के लिए धन्यवाद। हालांकि मेरे अनुभव में 'java.library.path' को रन टाइम पर सेट करने का कोई प्रभाव नहीं पड़ा।मुझे लगता है कि यह समान कारणों से हो सकता है कि आप रनटाइम पर क्लासपाथ क्यों नहीं बदल सकते हैं - http://stackoverflow.com/questions/271506/why-system-setproperty-cannot-change-the-classpath-at-run -टाइम – Clinton

+0

फिर आपको एक निर्भर पुस्तकालय के साथ एक और समस्या हो सकती है। रनटाइम पर lib पथ सेट करना पूरी तरह से ठीक काम करता है, मैं अपने पुस्तकालयों को इस तरह लोड करता था। –

+0

यह बिल्कुल सही नहीं है, नए lib.path के साथ क्लासलोडर को फिर से शुरू करने के लिए एक तरीका है। – Zorkus