मैं जेएनए का उपयोग कर जावा के साथ एक साझा लाइब्रेरी (सी में लिखा गया) लपेट रहा हूं। साझा लाइब्रेरी आंतरिक रूप से लिखी जाती है, लेकिन वह लाइब्रेरी किसी अन्य बाहरी लाइब्रेरी से फ़ंक्शंस का उपयोग करती है, जो फिर से दूसरी बाहरी लाइब्रेरी पर निर्भर करती है। तो स्थिति कुछ इस तरह है:जावा: निर्भरता के साथ साझा लाइब्ररियस लोड
ext1 < - ext2 < - आंतरिक
अर्थात आंतरिक बाहरी पुस्तकालय ext2 का उपयोग करता है जो फिर से बाहरी पुस्तकालय ext1 का उपयोग करता है। मैंने जो कोशिश की है वह है:
System.loadLibrary("ext1");
System.loadLibrary("ext2");
NativeLIbrary.loadLibrary("internal",xxx.class);
यह दृष्टिकोण "ext2" लाइब्रेरी लोड करते समय "अनसुलझा अपवाद" के साथ विफल रहता है; लिंकर प्रतीकों के बारे में शिकायत करता है जो वास्तव में पुस्तकालय "ext1" में मौजूद हैं। तो यह semmes कि System.loadLibrary() फ़ंक्शन वैश्विक रूप से उपलब्ध "ext1" से प्रतीकों को नहीं बनाता है? stdlib समारोह dlopen() के रूप में उपयोग करते समय:
handle = dlopen(lib_name , RTLD_GLOBAL);
सभी प्रतीकों @lib_name में पाया अनुवर्ती लोड में प्रतीक समाधान के लिए उपलब्ध हो जाएगा; मुझे लगता है कि मैं जावा विविधता System.loadLibrary() के लिए कुछ ऐसा करना चाहता था?
सादर - Joakim होव
पुस्तकालयों जावा संपत्ति 'java.library.path' में परिभाषित करने के लिए पथ है? –
अच्छी तरह से - पुस्तकालयों का पता लगाना वास्तव में एक और गड़बड़ी है, और मैंने System.load (full_path_to_shared_library) का उपयोग करने का सहारा लिया है - लेकिन मुझे लगता है कि समस्या यह है कि ज्यादातर नेटबीन समस्या है। पुस्तकालय "ext" लोड करते समय अपवाद प्रतीक समाधान चरण के दौरान होता है, यानी लाइब्रेरी सही ढंग से स्थित है और इसी तरह। मुझे लगता है कि यह डर है कि यह निम्न स्तर dlopen() रनटाइम में गहरे नीचे कॉल में RTLD_GLOBAL ध्वज (या इसकी कमी) से संबंधित है। – user422005