2009-12-04 10 views
11

संभव डुप्लिकेट:
How to bundle a native library and a JNI library inside a JAR?Bundling देशी dll

मैं देशी lib शामिल करने की जरूरत (jnotify लेकिन मुझे लगता है कि यह बात शामिल नहीं है) मेरी जार करने के लिए। मैं नेटबीन के साथ ऐसा करना चाहता हूं।

मैंने को manifest.mf फ़ाइल में जोड़ा और jnotify.dllprojektHome\src\lib\ फ़ोल्डर में जोड़ा। लेकिन दुर्भाग्य से नेटबीन manifest.mf फ़ाइल को ओवरडिंग कर रहा है।

मैं कैसे तय कर सकता हूं? क्या मैं केवल नेटबीन का उपयोग कर ऐसा कर सकता हूं? क्या यह लाइन 'Bundle-NativeCode: /lib/jnotify.dll; osname=win32 सही है? मैंने यह भी सुना है कि मुझे manifest.mf में डीएलएस हैश डालना चाहिए और मेरे जार पर हस्ताक्षर करना चाहिए। क्या यह सच है?

उत्तर

6

मुझे नहीं लगता कि जावा निष्पादन योग्य Bundle-NativeCode का समर्थन करता है। मुझे पूरा यकीन है कि OSGi विशेषता है। समर्थित विशेषताओं की सूची JAR File Specification में परिभाषित की गई है।

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

+0

उत्तर के लिए धन्यवाद। मुझे लगता है कि मैं इसे exe में लपेटने की कोशिश करूंगा। मैं सरल बल्ले बैच फ़ाइल बना सकता हूं लेकिन मुझे केवल एक फ़ाइल रखना पसंद है। लेकिन मुझे अभी तक उपयुक्त टूल नहीं मिला है। मैंने लंच 4j की कोशिश की लेकिन इसमें मूल libs जोड़ने के लिए विकल्प नहीं है। –

+0

मैंने 'user.dir' में dll फ़ाइल शामिल की और यह अच्छी तरह से काम किया। – Jus12

3

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

+2

क्या आपके पास ऐसा करने के लिए कोई कोड स्निपेट है? –

+0

http: // stackoverflow देखें।कॉम/ए/46 9 1879/11650 9 – artbristol

6

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

समस्या यह है कि 3 पार्टी libs (प्रारंभ में बहुत जल्दी सामान्य रूप से) कुछ बिंदु पर करना होगा

System.loadLibrary("native.dll"); 

है और यह एक त्रुटि फेंकता है तो native.dll appropiated जगह पर नहीं है।

यदि आपके पास तृतीय पक्ष लाइब्रेरी के जावा स्रोत तक पहुंच है तो उस कोड को पैच करना आसान हो सकता है और आप आसानी से JAR से अपना डीएल निकाल सकते हैं और तृतीय पक्ष lib का उपयोग करने से पहले System.load चला सकते हैं।

अद्यतन मुझे जेएनओटीआईआई स्रोतों में एक नज़र डाली गई थी। यह ठीक है मैं क्या कहा:

public class JNotify_win32 
{ 
    static 
    { 
     System.loadLibrary("jnotify"); /* *** */ 
     int res = nativeInit(); 
     if (res != 0) 
     { 
      throw new RuntimeException("Error initialiing native library. (#" + res + ")"); 
     } 
    } 

लें लाइन *** बाहर या कोशिश पकड़, System.load() और आपका काम हो गया साथ लोड के साथ चारों ओर।

+0

अच्छा बिंदु, लेकिन मुझे लगता है कि यह मेरे मामले में कोई समस्या नहीं है: "जेएनोटिफ़ाई का उपयोग करने के लिए, आपको अपने java.library.path में मूल लाइब्रेरी (jnotify.dll या jnotify.so) होना चाहिए ऐसा करने के लिए, जब आप जावा एप्लिकेशन चलाते हैं तो आपको -Djava.library.path prameter का उपयोग करने की आवश्यकता होती है। उदाहरण के लिए: java -cp jnotify.jar -Djava.library.path =। " –

+0

बहुत बहुत धन्यवाद। आप 100% सही हैं। मैं बल्ले बनाने के बारे में सोच रहा था और सोचा था कि डीएल के स्थान को बदलना एक समस्या होनी चाहिए। जब मैंने आपका जवाब पढ़ा तो मैंने सोचा "मैंने देखा है कि मैं अपने डेल के साथ हर चीज कर सकता हूं" लेकिन मैं पूरी तरह से अलग बात की जांच कर रहा था। मुझे थक जाना चाहिए। –