2010-03-29 13 views
9

मैं निम्नलिखित कोड सिस्टम.लोड लाइब्रेरी ("mydll") का उपयोग कर जावा में एक डीएल लोड करने की कोशिश कर रहा हूं;जावा में डीएलएल लोड हो रहा है - ग्रहण - जेएनआई

परियोजना डी: \ विकास \ परियोजना \ में रखी गई है और मैंने डीएल को डी पर रखा है:। मैं तो ग्रहण विन्यास में निम्नलिखित वीएम तर्क -Djava.library.path दिया = डी:/

लेकिन मैं UnsatisifiedLinkerError मिल जब मैं चलाते हैं। थोड़ी सी गुगलने के बाद, मैंने सिस्टम.लोड ("डी: \ mydll.dll") का उपयोग किया;

लेकिन फिर भी वही समस्या हो रही है, क्या कोई मदद कर सकता है?

+0

मैं इस कोड System.getProperty ("java.class.path") के साथ मेरी classpath परीक्षण किया है और रखा उस विशिष्ट पथ पर डीएलएल। उसके बाद, मुझे त्रुटि मिल रही है "आश्रित पुस्तकालय नहीं मिल सका"। मैं यह कैसे जांच सकता हूं कि यह कौन सी लाइब्रेरी पूछ रहा है: एस। मैं कुछ तृतीय पक्ष डीएल का उपयोग कर रहा हूँ। –

उत्तर

7

जहां आप लाइब्रेरी पथ में DLL फ़ाइल नाम निर्दिष्ट करते हैं, उसे छोड़ दें। इसके अतिरिक्त, आपका System.loadLibrary कॉल सिर्फ 'mydll' होना चाहिए। मैं आपको (अनुभव से) बता सकता हूं कि यदि आप ग्रहण (यानी, डी: \ ग्रहण कार्यक्षेत्र \ Proj) में अपनी परियोजना की जड़ में डीएलएल डालते हैं, तो कार्य करना चाहिए। कोई और लिंकर त्रुटियां अन्य डीएलएल खोजने के साथ निर्भरता समस्याओं से हो सकती हैं। अपवाद एक ही है। यह देखने के लिए कि क्या आपका DLL सिस्टम लाइब्रेरी पथ पर नहीं है, निर्भर करता है कि निर्भरता वॉकर (http://www.dependencywalker.com/) जैसे कुछ का उपयोग करें।

संपादित करें: UnsatisfiedLinkError: फेंक अगर जावा वर्चुअल मशीन के लिए एक विधि का एक उपयुक्त देशी-भाषा परिभाषा नहीं मिल सकता है देशी घोषित - यह है कि आपके पास JNI समारोह जो मौजूद नहीं है का उपयोग कर रहे है।

3

System.loadLibrary("mydll") का उपयोग ठीक काम करता है, आप इसका भी उपयोग कर सकते हैं।

  1. JVM अपने DLL नहीं मिल रहा है:: यदि आप javah का इस्तेमाल किया और आपको लगता है के साथ अपने DLL सब कुछ ठीक है, वहाँ दो possibilies हैं इस मामले में, अपने जावा पुस्तकालय पथ सही नहीं है (जो मुझे शक है) और आपको इसे . पर सेट करना चाहिए और वर्तमान में काम करने वाले डीआईआर में अपना डीएलएल रखें। आप अपने DLL में किसी भी निर्भर पुस्तकालयों है, तो वे नहीं JVM द्वारा खोजा गया है, लेकिन विंडोज अपने आप में:
  2. JVM एक DLL अपने DLL पर निर्भर करता है नहीं मिल रहा है। और विंडोज java.library.path नहीं जानता है, इसलिए यह उन लोगों के लिए सिस्टम PATH चर देखेंगे। यदि आपके पास संभावना है, तो आप जेवीएम शुरू करने से पहले सिस्टम PATH वैरिएबल को अपने डीएलएल के स्थान पर सेट कर सकते हैं और सब ठीक हो जाएगा। या आप इस

    सिस्टम.लोड लाइब्रेरी ("dll_1") जैसे JVM का उपयोग करके अपने सभी DLL लोड कर सकते हैं;
    System.loadLibrary ("dll_2");
    System.loadLibrary ("dll_3");

    जहां dll_3.dlldll_2.dll पर निर्भर करता है, जो dll_1.dll पर निर्भर करता है।

आशा है कि मदद करता है।

+0

ऐसा लगता है कि लिनक्स के तहत कि अवधारणा किसी भी तरह काम नहीं करती है, क्या किसी को पता है क्यों? – Zorkus

+0

यह मेरे लिए लिनक्स के तहत भी काम करना चाहिए। आप किस प्रकार की लाइब्रेरी लोड करने की कोशिश कर रहे हैं? –

0

@ एली- आप बस अपनी खिड़कियों के system32 फ़ोल्डर में dll फ़ाइलों को कॉपी और पेस्ट कर सकते हैं और सिस्टम.लोड लाइब्रेरी ("mydll") के माध्यम से लाइब्रेरी को कॉल करने का प्रयास कर सकते हैं ... मुझे लगता है कि यह काम कर सकता है ...

4

मूल निर्भरताओं को सही ढंग से सेट करने के तरीके की जांच करें here। इसके अतिरिक्त, सुनिश्चित करें कि आप सही JVM का उपयोग करते हैं: मेरे मामले में, डीएलएल नहीं मिला क्योंकि यह 32 बिट डीएलएल था, लेकिन मैंने x64 JVM का उपयोग किया था!

1

अपने Almafa.dll को सी में रखें:/जावा/jre7/lib या/bin क्षमा करें, मुझे बिल्कुल याद नहीं है। के बाद आप की जरूरत नहीं विन्यास किया है, सिर्फ इतना कहना

static{ System.LoadLibrary("Almafa"); }

कक्षा में

, जहां आप इसे लोड करना चाहते हैं। यह केवल जावा प्रोजेक्ट में काम करता है, एंड्रॉइड में प्रोजेक्ट की तरह आपको जेएनआई का उपयोग करने की आवश्यकता है। मैंने अब 3 दिनों का कोई नींद नहीं छोड़ा था :)

2

आपके पास एक समस्या है: System.load ("D: \ mydll.dll"); सिस्टम.लोड ("डी: \\ mydll.dll") होना चाहिए; या सिस्टम.लोड ("डी: /mydll.dll");

मुझे System.load के साथ और अधिक सफलता मिली है, लेकिन लोड लाइब्रेरी मल्टीप्लाफ्फ़्ट के लिए बेहतर ढंग से डिज़ाइन की गई है। यह आपके लिए विस्तार का आंकड़ा बताता है।

0

System.loadLibrary जेवीएम पथ (जेडीके बिन पथ) से डीएलएल लोड करता है।

आप एक पथ के साथ एक स्पष्ट फ़ाइल को लोड करना चाहते हैं, का उपयोग System.load()

यह भी देखें: Difference between System.load() and System.loadLibrary in Java

public class MyClass 
{ 
    static 
    { 
     System.load("MyJNI.dll"); 
    } 
} 
0

देशी पुस्तकालय स्थान के रूप में अपनी परियोजना में पुस्तकालय पथ दो, लगता है हल करने के लिए।

0

मैं अपने त्रुटि निम्नलिखित का उपयोग करके हल किया गया:

static { 
    try { 
     System.loadLibrary("myDLL"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

के बजाय का उपयोग कर System.load("myDLL.dll")

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