2008-10-01 21 views
10

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

तो, समस्या यह है कि मैं एक और कॉल जोड़ता हूं जो एक नया बाहरी डीएलएल का उपयोग करता है, और अचानक लोड करते समय लाइब्रेरी, एक असंतुष्ट लिंक्स त्रुटि फेंक दी गई है। संदेश है: 'निर्दिष्ट प्रक्रिया नहीं मिली'। यह एक लापता आश्रित डीएलएल के साथ एक समस्या प्रतीत नहीं होता है, क्योंकि मैं एक निर्भर डीएलएल को हटा सकता हूं और निर्भर डीएलएल के बारे में एक अलग संदेश प्राप्त कर सकता हूं। जो मैं ऑनलाइन ढूंढने में सक्षम हूं, ऐसा प्रतीत होता है कि इस संदेश का अर्थ है कि डीएलएल से मूल जावा फ़ंक्शन कार्यान्वयन गुम है, लेकिन यह अजीब बात है कि यह इस अतिरिक्त कोड के बिना ठीक काम करता है।

क्या किसी को पता है कि इसका कारण क्या हो सकता है? UnsatisifedLinkError के लिए 'किस प्रकार की निर्दिष्ट प्रक्रिया नहीं मिली' संदेश दे सकते हैं?

उत्तर

14

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

उदाहरण के तौर पर, हमारे पास input.dll नामक एक लाइब्रेरी है। डीएलएल खोज आदेश हमेशा एप्लिकेशन निर्देशिका पहले और पैथ निर्देशिकाओं को हमेशा देखना है। अतीत में, हम हमेशा input.dll के समान निर्देशिका से एक्जिक्यूटिव चलाते थे। हालांकि, विंडोज सिस्टम निर्देशिका में एक और input.dll है (जो डीएलएल खोज आदेश के बीच में है)। तो जब जावा एप्लेट से इसे चलाते हैं, तो अगर मैं एप्लेट में ऊपर वर्णित कोड शामिल करता हूं, जो input.dll को लोड करने का कारण बनता है, तो यह सिस्टम निर्देशिका से input.dll लोड करता है। चूंकि हमारा कोड input.dll में कुछ फ़ंक्शंस की अपेक्षा कर रहा है जो वहां नहीं हैं (क्योंकि यह एक अलग DLL है) लोड लापता प्रक्रियाओं के बारे में त्रुटि संदेश के साथ विफल रहता है। ऐसा नहीं है क्योंकि जेएनआई कार्यों को गलत निर्यात किया जाता है, लेकिन क्योंकि गलत आश्रित डीएलएल लोड किया गया था और इसमें अपेक्षित कार्य नहीं थे।

+0

मुझे यह समस्या थी। libBv2 और libC में libA खींच लिया। LibBv2 और libC दोनों पाए जा रहे थे। समस्या यह थी कि libC एक अलग संस्करण, libBv1 पर निर्भर था। libBv1 और libBv2 एक साथ काम नहीं किया। निर्भरता वॉकर ने पुस्तकालयों को दिखाया लेकिन मैंने libC की निर्भरताओं का विस्तार नहीं किया था। मैंने लाइब्रेरी लोड होने के लिए procmon (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) का उपयोग किया और जब मैंने libb के दूसरे संस्करण को लोड किया, तो मैंने देखा। – codeDr

0

आमतौर पर, अन्य पुस्तकालयों को जोड़ने पर, आपको प्रासंगिक .lib फ़ाइल से लिंक करने की आवश्यकता होती है। ऐसा लगता है कि आप की जरूरत सभी lib फ़ाइलों का संदर्भ नहीं दे रहे हैं। जांचें कि क्या लिंक नहीं है और सुनिश्चित करें कि आप लिंकर के लिए सूची में इसे lib बना दें।

2

एक मौका है कि डीएलएल सी ++ (सी के विपरीत) का उपयोग करके बनाया गया था। जब तक आप प्रक्रिया पर एक बाहरी करने की देखभाल नहीं करते हैं, यह एक संभावित कारण है।

डीएलएल से सभी कार्यों को निर्यात करने का प्रयास करें। यदि सूची में आपका फ़ंक्शन शामिल है, तो आप अच्छे हैं।

+0

मैंने पीई एक्सप्लोरर में डीएलएल खोला और दो बार जांच की कि जेएनआई कार्यों को सी लिंकेज का उपयोग करके निर्यात किया जाता है। मैंने भी दोबारा जांच की, और जेएनआई कार्यों के हस्ताक्षर उसी मामले में समान दिखते हैं जहां डीएलएल त्रुटि के बिना लोड करता है और जिस स्थिति में यह विफल रहता है। – matt

0

क्या आपने मानक जेएनआई प्रक्रिया का उपयोग कर नया बाहरी डीएलएल बनाया था? यानी, जावा का उपयोग करके और आगे? यदि ऐसा है, तो मुझे यकीन नहीं है कि क्या गलत है।

यदि नहीं, तो आप जिस प्रक्रिया को कॉल करने का प्रयास कर रहे हैं उसे निर्यात नहीं किया गया है (जैसा कि anjanb द्वारा उल्लिखित है)। मैं निर्यात कार्यों के दो तरीकों से अवगत हूं: एक अलग निर्यात सूची और __declspec (dllexport) के साथ विशिष्ट कार्यों को चिह्नित करना।

Can't access variable in C++ DLL from a C app में डीएलएल के विषय की थोड़ी अधिक जानकारी है।

+0

मैं मानक जेएनआई प्रक्रिया का उपयोग कर रहा हूं। जैसा कि मैंने कहा, मैंने कुछ मामलों में काम किया है। लेकिन जब मैं यह अतिरिक्त कोड जोड़ता हूं, तो अचानक यह दी गई त्रुटि के साथ काम करना बंद कर देता है। जैसा कि बताया गया है, त्रुटि इंगित करती है कि फ़ंक्शन निर्यात नहीं किया गया है, लेकिन मैं सकारात्मक हूं कि फ़ंक्शंस निर्यात किए जाते हैं। – matt

0

डीबग मोड में अपने सी ++ कोड को संकलित करें। फिर डीबगब्रैक() डालें; कथन जहां आप डीबगिंग शुरू करना चाहते हैं। जावा कोड चलाएं।जब DebugBreak() कथन का सामना करना पड़ता है तो आपको उस पर एक डीबग बटन के साथ एक पॉपअप मिलेगा। इस पर क्लिक करें। देव स्टूडियो आपके प्रोग्राम के साथ मशीन कोड में खुल जाएगा। डीबगर के साथ दो बार कदम उठाएं और आपको अपने स्रोत कोड पर कदम उठाने में सक्षम होना चाहिए।

0

यदि आपने जेएनआई मैनुअल और उदाहरणों पर सभी प्रोग्रामिंग समस्याएं की हैं लेकिन फिर भी आपको एक ही गायब प्रक्रिया त्रुटि मिल रही है, तो समस्या शायद आपके पथ चर पर हो सकती है। नीचे दिए गए चरणों करो और फिर से चलाने: वातावरण चर सेटिंग पैनल पर परिभाषित var:: JAVA_HOME वैल

  1. यकीन है कि के बारे में आप अपने JDK फ़ोल्डर (नहीं JRE क्योंकि JRE does not को JNI शीर्षक शामिल) उदाहरण के लिए JAVA_HOME चर सेट रहें: C: \ Program Files \ जावा \ jdk1.7.0_11
  2. अपने पथ चर करने के लिए % JAVA_HOME% \ बिन जोड़ने

उन कदमों करने के बाद, आपके आवेदन JNI प्रक्रिया नाम और JNI के लिंक मिल सकता है । सही तरीके से डीएलएल। इसलिए, मुझे आशा है कि आपको यह गुम प्रक्रिया त्रुटि फिर से न मिल जाएगी।

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