java - जेएनए: नेटी लाइब्रेरी निर्भरता और जार निष्कर्षण



dll jar (1)

यह मानते हुए कि आपके द्वारा जारी किए गए एकमात्र समस्या पर निर्भर पुस्तकालय का नाम है, देखें Native.extractFromResourcePath() । आप अपनी गैर-स्पष्ट निर्भरताओं को निकालने के लिए और File.rename() का उपयोग कर सकते हैं यह सुनिश्चित करने के लिए कि पुस्तकालय में आप चाहते हैं नाम है।

मैं जेएनए के माध्यम से एमएसपी 430 डीएलएल (यहां देखें) का उपयोग करूँगा। लेकिन इस लाइब्रेरी में अन्य मूल लाइब्रेरी की निर्भरता है, जो कि एमएसपी 430.dll के साथ बंडल किए गए हैं। इस आश्रित देशी पुस्तकालय को HIL.dll कहा जाता है। Jna.library.path के उपयोग के साथ सभी एकदम सही काम करते हैं। अब मैं अपने स्वयं के .jar पैकेज में देशी पुस्तकालयों को बंडल करूँगा। तो मैं जेएनए फ्रेमवर्क के जार से स्वचालित मूल पुस्तकालय लोडिंग का उपयोग करूँगा। लेकिन ये मूल पुस्तकालयों के साथ समस्याएं हैं जिनकी निर्भरताएं हैं अगर मैं MSP430.dll और HIL.dll को मेरे .jar पैकेज में पैकेज करता हूं तो मुझे निम्न त्रुटि मिलती है: "JNA java.lang.UnisfiedLinkError और निर्दिष्ट मॉड्यूल नहीं मिला"। इसका मतलब है, MSP430.dll की निर्भरता को HIL.dll पर हल करना संभव नहीं था। जेएनए के डिबग आउटपुट में मैं देख सकता हूं, केवल एमएसपी 430.dll, .jar पैकेज से निकालेगा। इस संदर्भ में त्रुटि समझा जा सकती है। अगले निशान में, मैं स्पष्ट HIL.dll लोड और मैं MSP430.dll के बाद HIL.dll के निकासी देख सकते हैं। लेकिन मैं अभी भी जेएनए से मॉड्यूल त्रुटि प्राप्त करता हूं।

मैंने निकासी विधि के जेएनए कोड को देखा है मुझे लगता है कि जेएनए ने देशी पुस्तकालयों को सिस्टम अस्थायी निर्देशिका में निकाला है और अपने स्वयं का अस्थायी डायरेक्टरी बनाता है लेकिन अब मुझे लगता है कि समस्या यह है कि जेएनए स्थानीय पुस्तकालयों के लिए "जेएनए" उपसर्ग और एक अनूठे उत्पन्न संख्यात्मक मान के लिए अस्थायी फाइल बनाता है। यहां जेएनए का उत्पादन:

Found library 'HIL.dll' at C:\Users\RD3\AppData\Local\Temp\jna-80961\jna1305152974718331988.dll

मुझे लगता है कि MSP430.dll को HIL.dll को खोजने के लिए अपरनेम की आवश्यकता है। मेरे पास एचआईएल डीएलएल के सीधी लोडिंग के साथ एक परीक्षण है जिसमें आवेदन में पहली कॉल के रूप में निम्नलिखित है

System.loadLibrary(C:\\absolutepath\\HIL.dll);

तब केवल एमएसपी 430.dll को जेएनए द्वारा .jar पैकेज से लोड करता है, यह बिना समस्याओं के काम करता है। उसके बाद मैं HIL.dll को lol.dll पर पुनर्नामित करूँगा और इस कॉल का उपयोग करेगा:

System.loadLibrary(C:\\absolutepath\\lol.dll);

तो मुझे JNA से फिर से मॉड्यूल त्रुटि मिलती है। MSP430.dll नामक HIL.dll को हल करने में सक्षम नहीं था।

यह मूल रूप से एक देशी लाइब्रेरी को .jar पैकेज में निर्भरताओं के साथ पैकेज करने और जेएनए के साथ लोड करने के लिए संभव है?

यहां जेएनए के माध्यम से एचआईएल.dll की स्पष्ट लदान के साथ जेएनए डीबग आउटपुट:

C:\Users\RD3\Desktop>call "C:\Program Files (x86)\Java\jre1.8.0_25\bin\java.exe"
 -Djna.debug_load=true -jar C:\Data\Workspace\NetBeans\MspApiTest\target\MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar
Looking in classpath from sun.misc.[email protected] for /com/sun/jna/win32-x86/jnidispatch.dll
Found library resource at jar:file:/C:/Data/mstandfuss/Workspace/NetBeans/MspApiTest/target/MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar!/com/sun/jna/win32-x86/jnidispatch.dll
Looking for library 'HIL.dll'
Adding paths from jna.library.path: null
Trying HIL.dll
Adding system paths: []
Trying HIL.dll
Looking for lib- prefix
Trying libHIL.dll
Looking in classpath from sun.misc.[email protected] for HIL.dll
Found library resource at jar:file:/C:/Data/mstandfuss/Workspace/NetBeans/MspApiTest/target/MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar!/win32-x86/HIL.dll
Found library 'HIL.dll' at C:\Users\RD3\AppData\Local\Temp\jna-80961\jna1305152974718331988.dll
Looking for library 'MSP430.dll'
Adding paths from jna.library.path: null
Trying MSP430.dll
Adding system paths: []
Trying MSP430.dll
Looking for lib- prefix
Trying libMSP430.dll
Looking in classpath from sun.misc.[email protected] for MSP430.dll
Found library resource at jar:file:/C:/Data/mstandfuss/Workspace/NetBeans/MspApi
Test/target/MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar!/win32-x86/MSP430.dll
Exception in thread "main" java.lang.UnsatisfiedLinkError: Das angegebene Modul wurde nicht gefunden.

        at com.sun.jna.Native.open(Native Method)
        at com.sun.jna.Native.open(Native.java:1759)
        at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:260)
        at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398)
        at com.sun.jna.Library$Handler.<init>(Library.java:147)
        at com.sun.jna.Native.loadLibrary(Native.java:412)
        at com.sun.jna.Native.loadLibrary(Native.java:391)
        at de.sitec.jmspflash.Msp430Native.<clinit>(Msp430Native.java:22)
        at de.sitec.jmspflash.Msp430Impl.init(Msp430Impl.java:50)
        at de.sitec.jmspflash.Msp430Impl.createMsp430Impl(Msp430Impl.java:36)
        at de.sitec.mspapitest.App.main(App.java:34)

C:\Users\RD3\Desktop>

सादर





jna