2013-02-21 56 views
6

से बाहरी डीएलएल फ़ंक्शन को कॉल करने के लिए मुझे जावा कोड से बाहरी DLL लाइब्रेरी फ़ंक्शन को कॉल करने की आवश्यकता है। मैं नेटबीन्स 7.2 का उपयोग करता हूं। मेरे dll के कार्य हैं:जावा कोड

Boolean isValid(string word) 
List<String> getWords(String word) 

मैं this उदाहरण का अनुसरण कर रहा हूँ। लेकिन मुझे नहीं पता कि मेरे डीएलएल कार्यों की घोषणा कैसे करें। और मुझे एक और link मिला। लेकिन यह मेरे लिए काम नहीं करता है।

+6

"यह मेरे लिए काम नहीं करता है" आपके लिए आपकी सहायता करने के लिए * लगभग * पर्याप्त जानकारी नहीं है। आपको हमें यह बताना होगा कि आपने क्या प्रयास किया है, और परिणाम क्या थे। कृपया http://tinyurl.com/so-list –

+0

पढ़ें क्या काम नहीं करता है?क्या आप कुछ कोड साझा कर सकते हैं जो आपने कोशिश की? –

+0

लिनक्स के लिए: http://stackoverflow.com/a/30635871/895245 –

उत्तर

2

आप Java Native Interface (JNI), जो C/C++ फ़ंक्शन जो मूल कोड जावा कोड के साथ इंटरफेस करने के लिए अनुमति का एक सेट है का उपयोग करने की आवश्यकता होगी (अर्थात जावा फ़ंक्शन कॉल से पैरामीटर प्राप्त करने, परिणाम देने, आदि)। एक रैपर सी लाइब्रेरी लिखें जो जेएनआई कॉल प्राप्त करे और फिर अपनी बाहरी लाइब्रेरी को कॉल करें।

उदाहरण के लिए, निम्न फ़ंक्शन किसी मूल ऑब्जेक्ट पर विधि updateHandlers को आमंत्रित करता है (जो जावा पक्ष में लंबे समय तक संग्रहीत होता है)।

class MyImpl { 
    void updateHandlers(JNIEnv *env) { 
    this->contentHandler = ....; 
    } 
} 

JNIEXPORT void JNICALL Java_package_Classname_updateHandlers0 
    (JNIEnv *env, jobject obj, jlong ptr) 
{ 
    ((MyImpl*)ptr)->updateHandlers(env); 
} 

package.ClassName में इसी घोषणाओं हैं:

private long ptr; //assigned from JNI 
public void updateHandlers() { 
    if (ptr==0) throw new NullPointerException(); 
    updateHandlers0(ptr); 
} 
private native void updateHandlers0(long ptr); 

static { 
    try { 
      /*try preloading the library external.dll*/ 
     System.loadLibrary("external"); 
    } catch (UnsatisfiedLinkError e) { 
     /*library will be resolved when loading myjni*/ 
    } 
    System.loadLibrary("myjni"); //load myjni.dll 
} 
1

आप हस्ताक्षर कि आप की आवश्यकता के साथ जावा (native private ...) में अपनी मूल कार्यों की घोषणा; फिर मूल शीर्षलेख उत्पन्न करने के लिए javah (जेडीके के साथ प्रदान किया गया एक उपकरण) चलाएं। List<String> (वास्तव में List, टाइप एरर के कारण) jobject देशी कोड में है।

इसी सी विधि, होगा:

JNIEXPORT jobject JNICALL package_Classname_getWords(JNIEnv *env, jobject jobj, jstring word) 

मुझे लगता है कि यह आसान होगा लौटे मूल्यों से तार jobjectArray की एक सरणी लौटने के लिए, और जावा में सूची का दृष्टांत के लिए। this example देखें।

6

मैंने "जावा से डीएलएल को कॉल करने" की एक ही समस्या पर ठोकर खाई और पहली बार जटिलता के बारे में निराश था। फिर भी, एक सुरुचिपूर्ण समाधान है (प्रसंस्करण.org आवास में लोगों के लिए भी दिलचस्प हो सकता है ..) प्रश्न के बजाय "सामान्य" रूप को देखते हुए (शायद, डाउन्रेटिंग इसके लिए उचित नहीं है), मुझे लगता है , एक आसान आसान समाधान संकेत दिया जाएगा। दूसरे शब्दों में, एक समाधान जो हेडर फाइलों, अतिरिक्त रूपांतरण इत्यादि के साथ मेरिंग aronud से बचाता है, जैसे स्रोत कोड आवश्यक रूप से उपलब्ध नहीं है।

इसके लिए मेरी सिफारिश जेएनए (https://github.com/twall/jna) होगी, जो मूल रूप से जेएनआई के आसपास एक सरलीकृत रैपर है। यह बहुत अच्छा काम करता है, टाइप मैपिंग सरल है (उदाहरण के लिए pchar = lpcstr buffer -> string), हालांकि मैं इसे केवल विंडोज डीएलएल और डेल्फी-पास्कल का उपयोग करके बनाए गए अपने स्वयं के सी-शैली डीएलएल की ओर उपयोग कर रहा हूं। विचार करने की एकमात्र चीज यह है कि वापसी मूल्यों को "आउट" ध्वज संदर्भ चर के बजाय कार्यों के माध्यम से निर्यात किया जाना चाहिए। प्रश्न पहले से ही एक लिंक किए गए स्रोत को इंगित करता है जो इसके लिए एक उदाहरण प्रदान करता है (इसलिए, जेएनआई के आसपास के उत्तरों को यहां गलत स्थान दिया जा सकता है)। ध्यान दें कि मेरे द्वारा प्रदान किए गए लिंक में सरणी और पॉइंटर्स के स्थानांतरण के लिए axamples भी शामिल हैं।