问题
I put together a program that uses JACOB to access iTunes ... It works fine in Eclipse but when I export it and run it in the command prompt I get an unsatisfied link error telling me that jacob-1.17-M2-x86.dll is not in my java.library.path.
Ive tried putting it in system32, setting the native library location to its directory...ive tried using the system.setproperties trick...and i couldnt figure out how to use java -d properly
What else can I do? ive been searching the web trying to get this compatible for over 4 hours and nothing seems to work.
回答1:
I found an amazing post by a sun programmer that fixed my problem!
public static void addDir(String s) throws IOException {
try {
// This enables the java.library.path to be modified at runtime
// From a Sun engineer at http://forums.sun.com/thread.jspa?threadID=707176
Field field = ClassLoader.class.getDeclaredField("usr_paths");
field.setAccessible(true);
String[] paths = (String[])field.get(null);
for (int i = 0; i < paths.length; i++) {
if (s.equals(paths[i])) {
return;
}
}
String[] tmp = new String[paths.length+1];
System.arraycopy(paths,0,tmp,0,paths.length);
tmp[paths.length] = s;
field.set(null,tmp);
System.setProperty("java.library.path", System.getProperty("java.library.path") + File.pathSeparator + s);
} catch (IllegalAccessException e) {
throw new IOException("Failed to get permissions to set library path");
} catch (NoSuchFieldException e) {
throw new IOException("Failed to get field handle to set library path");
}
}
Then I added before my use of the JACOB methods
addDir("C:" + File.separator + "java" + File.separator + "jre7" + File.separator + "lib")
Worked like a charm.
回答2:
Another workaround:
Just before you try to load the file, go to ClassLoader.java (java\lang\ClassLoader.java
). Set a breakpoint at the following line:
File libfile = new File(sys_paths[i], System.mapLibraryName(name));
That function is located in function:
static void loadLibrary(Class<?> fromClass, String name, boolean isAbsolute)
When you did the breakpoint and you use IntelliJ, you will notice in grey a path where it is looking for. My path was C:\Program Files\Java\jdk1.8.0_161\jre\bin
. When you put the needed DLL's filed there, it will work.
来源:https://stackoverflow.com/questions/15941234/unsatisfiedlinkerror-with-jacob-and-jre-1-7