2009-07-06 11 views
14

मैं जेएनआई के माध्यम से एक पुस्तकालय चला रहा हूं (मैंने इसे नहीं लिखा), और आंतरिक रूप से यह एक और डीएलएल कहता है। जब तक मैं सिस्टम पीएटीएच वैरिएबल (मैं विंडोज एक्सपी पर हूं) पर अन्य डीएलएल का मार्ग नहीं डालता, तब तक मुझे "निर्भर पुस्तकालय नहीं मिल रहा है" कहने में एक त्रुटि मिलती है। मैं जावा कमांड लाइन पर इसे संभालने में सक्षम होना चाहता हूं, और मैंने इसे पहले से ही -jjava.library.path और क्लासपाथ में जोड़ने का प्रयास किया है, न तो जो काम करता है (मुझे उम्मीद है- djava.library.path काम करने के लिए लेकिन क्लासपाथ नहीं, लेकिन न तो काम किया)। क्या इसे करने का कोई तरीका है?जेएनआई निर्भर पुस्तकालय

धन्यवाद,

जेफ

उत्तर

18
  • आप एक DLL नाम है 'MyNativeDLL.dll' तो आप अपने LoadLibrary कॉल में 'MyNativeDLL' का उपयोग करना चाहिए।
  • उपयोग Dependency Walker अगर कोई MyNativeDLL.dll
  • तो देखते हैं के लिए आवश्यक फ़ाइलें हैं जाँच करने के लिए, उन्हें MyNativeDLL.dll को उसी फ़ोल्डर में शामिल हैं - एक तो आप इसे कोशिश System32 फ़ोल्डर में अतिरिक्त आवश्यक फ़ाइलें डाल काम कर पाने के।
+0

जो काम करेगा, लेकिन मैं निर्भर डीएलएल किसी भी फ़ोल्डर में होना चाहता हूं और फिर उस फ़ोल्डर को संदर्भित करना चाहता हूं। क्या यह संभव है? –

+0

हमारे पास ऐसी ही स्थिति थी जहां हमें LoadLibrary कॉल का उपयोग करके OurJNI.dll और OurNative.dll लोड करना पड़ा। फिर, जिस क्रम में वे लोड होते हैं। हमें ऐसा करने का कोई और तरीका नहीं मिला। – Vivek

+2

दाएं - डीएलएल नरक में आपका स्वागत है। हमारे मामले में, मैं केवल A.dll लोड कर रहा हूं जो आंतरिक रूप से संदर्भित करता है B.dll इसलिए बी को हमेशा ए के बाद लोड किया जाना चाहिए। मैं केवल पैथ चर को संशोधित करने से बचने की कोशिश कर रहा था। –

5

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

मैं इसे एक वेब ऐप में कर रहा था जहां एक जार में डीएलएल शामिल थे जो अनपॅक हो रहे थे। आपकी स्थिति सरल लगती है, इसलिए मेरा मानना ​​है कि इसे काम करना चाहिए। मैं आमतौर पर यहां समाधान का पालन करता हूं: How to make a JAR file that includes DLL files?

0

मैंने सफलतापूर्वक जेएनए का उपयोग करके पैथ वैरिएबल में एक फ़ोल्डर इंजेक्शन दिया है। यदि आप वैश्विक पर्यावरण को झुकाए या स्पष्ट डीएलएल लोड ऑर्डर के साथ गड़बड़ किए बिना अपने आवेदन के साथ अपने आश्रित डीएलएल को तैनात करना चाहते हैं तो इसे एक वर्कअराउंड के रूप में उपयोग किया जा सकता है।

हालांकि यह मुझे स्पष्ट नहीं है कि क्लासलोडर जीवन चक्र इस पर कैसे प्रभाव डालता है। मैंने नेटबीन मॉड्यूल सिस्टम के तहत केवल इस तकनीक को आजमाया है, लेकिन यदि आप loadLibrary के लिए क्लासलोडर क्लास कोड देखते हैं, तो आप देखेंगे कि यह कुछ पथ चर को कैश करता है। लाइब्रेरी को लोड करने के लिए एक नया क्लासलोडर बनाने के लिए आवश्यक हो सकता है या नहीं भी हो सकता है।

नकारात्मकता आपको जेएनए या जेएनआई का उपयोग करने की आवश्यकता है। इसके अलावा, यह एक सुंदर सकल हैक की तरह लगता है। जेएनए का उपयोग करके पर्यावरण चर सेट करने के उदाहरण के लिए here देखें।

2

इससे मुझे बहुत मदद मिली। भी कामयाब एक JNI dll बनाया लोड हो रहा है का उपयोग कर cygwin:

पहले:

/* conditioned if OS is windows because also need it to work in Linux env. */ 
System.loadLibrary("cygwin1"); 

तो:

System.loadLibrary("mylib"); 

खिड़कियों पर, यह या तो java.library.path की स्थापना दोनों लाइब्रेरी से मेल करने के लिए की आवश्यकता है स्थानों।

यदि ग्रहण से चल रहा है, तो इस सेटिंग को जावा बिल्ड पथ (जेआरई पुस्तकालय सेटिंग्स में) में "मूल पुस्तकालय स्थान" द्वारा प्रतिस्थापित किया जा सकता है।

हालांकि, अभी भी यह थोड़ा मुश्किल लगता है।

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