भाग 1
मैं जावा एप्लिकेशन विकसित कर रहा हूं जिसे जार के रूप में रिलीज़ किया जाना चाहिए। यह कार्यक्रम जेएनआई द्वारा बुलाए गए सी ++ बाहरी पुस्तकालयों पर निर्भर करता है। उन्हें लोड करने के लिए, मैं एक पूर्ण पथ के साथ विधि System.load
का उपयोग करता हूं और यह ठीक काम करता है।जावा - एक सापेक्ष पथ से डीएलएस लोड हो रहा है और उन्हें एक जार
हालांकि, मैं वास्तव में उन्हें जार के अंदर "छिपाना" चाहता हूं, इसलिए मैंने उन्हें एकत्र करने के लिए एक पैकेज बनाया है। यह मुझे एक सापेक्ष पथ - पैकेज पथ लोड करने के लिए मजबूर करता है। इस दृष्टिकोण से, मैंने डीएलएल को जोड़ने या पिछली स्थापना प्रक्रिया से ऊबने के बारे में चिंतित किए बिना उपयोगकर्ता को किसी भी निर्देशिका में JAR चलाने दिया।
यह उम्मीद अपवाद फेंकता है:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library
मैं इस काम के कैसे मिल सकता है?
भाग 2
एक फ़ोल्डर में DLLs को कॉपी करने की दृष्टिकोण (नीचे समझाया) ही काम करता है जब मैं ग्रहण वातावरण के अंतर्गत इसे चलाने के।
Exception in thread "main" java.lang.reflect.InvocationTargetException
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56) Caused by: java.lang.UnsatisfiedLinkError: C:\Users\Supertreta\Desktop\nm files\temp\jniBin.dll: Can't find dependent libraries at java.lang.ClassLoader$NativeLibrary.load(Native Method)
मैं इस लदान विधि चलाएँ:: एक निर्यात जार चल रहा है, DLL बाइनरी अच्छी तरह से बनाई गई हैं, लेकिन JNI एक लोड हो रहा है अगले अपवाद फेंकता
public static void loadBinaries(){
String os = System.getProperty("os.name").toLowerCase();
if(os.indexOf("win") >= 0){
ArrayList<String> bins = new ArrayList<String>(){{
add("/nm/metadata/bin/dependence1.dll");
add("/nm/metadata/bin/dependence2.dll");
add("/nm/metadata/bin/dependence3.dll");
add("/nm/metadata/bin/dependence4.dll");
add("/nm/metadata/bin/jniBin.dll");
}};
File f = null;
for(String bin : bins){
InputStream in = FileManager.class.getResourceAsStream(bin);
byte[] buffer = new byte[1024];
int read = -1;
try {
String[] temp = bin.split("/");
f = new File(TEMP_FOLDER, temp[temp.length-1]);
FileOutputStream fos = new FileOutputStream(f);
while((read = in.read(buffer)) != -1) {
fos.write(buffer, 0, read);
}
fos.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.load(f.getAbsolutePath());
}
}
मुझे लगता है कि यह एक पहुँच विशेषाधिकार समस्या हो सकती है , लेकिन यह नहीं पता कि इसे कैसे हल किया जाए। तुम क्या सोचते हो?
क्यों आप उन्हें छिपाने के लिए करना चाहते हैं? –
एक साफ जार प्रदान करने के लिए – supertreta