我在运行时遇到以下错误,同时尝试运行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...])
我的问题是:
1)它到底想要找到什么以及在哪里?
2)为什么它显然搜索myproject/target/classes/
目录?我无处可去。
3)为什么它忽略了我在Eclipse中的用户库描述中为tess4j.jar
设置的“本机目录路径”?我的DLL就在那里。如果它没有忽略路径,它会找到DLL。
4)为什么它显然在win32-x86-64/
前面加上DLL名称?我无处可去。这是某些API的标准前缀吗?
5)什么是“资源路径”?怎么设置呢?
就像错误说的那样,它正在寻找win32-x86-64/libtesseract302.dll
中的java.class.path
。你的类路径的一部分显然包括myproject/target/classes
。
前缀表示要加载的共享库的平台和体系结构,允许将不同目标的共享库包含在同一个归档中。如果JNA无法在系统加载路径中找到所请求的库名称,则它会尝试在您的资源路径中找到它(如果需要,将其解压缩)。因此,如果您将DLL放在jar文件中,则需要为其添加win32-x86-64
前缀以便加载它。
“资源路径”名义上是你的阶级路径;几乎任何地方都可以通过ClassLoader.getResource()
到达。
该错误源于您尝试在64位JVM中加载32位DLL。可能的解决方案是切换到32位JVM;或者,使用64-bit Tesseract and Leptonica DLLs。
为什么不使用JNA API http://www.java2s.com/Code/Jar/j/Downloadjna351jar.htm
加载本机库?一旦进入项目类路径,就可以添加此代码
NativeLibrary.addSearchPath("libtesseract302", "your native lib path");
确保你有这个libtesseract302.dll文件,通常它位于windows32
文件夹中。
例如,如果您的libtesseract302.dll文件位于c:/abcv/aaa/libtesseract302.dll
的某个地方,那么您只需设置像这样的路径NativeLibrary.addSearchPath("libtesseract302", "c:/abcv/aaa");
我不知道windows路径如何看起来像c:/abcv/aaa
或c:\\abcv\\aaa\\
如果你想要更简单的方法,只需将所有必要的dll文件放入你的windows32文件夹,JVM就会照顾它。
另一个问题可能是您未正确安装应用程序或应用程序版本与您的jar版本无法匹配。尝试安装最新的应用程序并下载最新的jar再试一次。希望能帮助到你 :)
有同样的问题,用以下行排序
System.load( “在/ usr / local / lib目录/ liblept.so.5”)
的System.loadLibrary( “正方体”)
对于您的情况,它可能是不同的库,但最终几乎是相同的:只需手动加载您需要的库。
我有同样的问题,发现这个“资源路径”不是由“本机目录路径”设置的。 但是,您可以使用“库”选项卡中的“添加外部类文件夹”向其添加新文件夹,即使此文件夹不包含任何类文件,也包含本机库文件(如Windows上的DLL)
几天前,当我尝试使用JNA加载C ++ DLL时,我遇到了同样的错误消息。事实证明,原因是我的DLL所依赖的DLL丢失。
在我的情况下,它是MS Visual Studio 2012可再发行组件,然后我下载并安装在机器上,问题就消失了。尝试使用Dependency Walker查找任何缺少的库并安装它们。
我遇到了类似的问题,我尝试了上面的所有答案,但它没有解决我的问题,最后我检查了我从哪里得到了dll的源,发现我没有安装windows redistributable 2012,dll是使用它,一旦我安装它,异常就消失了。