UnsatisfiedLinkError - Unable to load library - Native library not found in resource path

Suzan Cioc picture Suzan Cioc · Nov 4, 2013 · Viewed 38k times · Source

I have the following error at runtime, while trying to run Tess4J:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'libtesseract302': Native library (win32-x86-64/libtesseract302.dll) not found in resource path ([myproject/target/classes/, ...some jars...])

My questions are:

1) What exactly it tries to find and where?

2) Why is it apparently searches for myproject/target/classes/ directory? I set it nowhere.

3) Why is it ignores "native directory path" I set for tess4j.jar in user library descripto in Eclipse? My DLLs are there. If it didn't ignore the path, it would find DLLs.

4) Why is it apparently prepending DLL name with win32-x86-64/? I set this nowhere. Is this standard prefix of some API?

5) What is "resource path"? How to set it?

Answer

technomage picture technomage · Nov 5, 2013

Like the error says, it's looking for win32-x86-64/libtesseract302.dll in java.class.path. Part of your classpath apparently includes myproject/target/classes.

The prefix represents the platform and architecture of the shared library to be loaded, which allows shared libraries for different targets to be included in the same archive. If JNA cannot find the requested library name in the system load path, then it attempts to find it within your resource path (extracting it, if necessary). So if you put the DLL in a jar file, you'll need to give it the win32-x86-64 prefix in order for it to load.

The "resource path" is nominally your class path; basically anywhere reachable by ClassLoader.getResource().