UnsatisfiedLinkError - 无法加载库 - 在资源路径中找不到本机库

问题描述 投票:8回答:7

我在运行时遇到以下错误,同时尝试运行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)什么是“资源路径”?怎么设置呢?

java eclipse dll java-native-interface jna
7个回答
5
投票

就像错误说的那样,它正在寻找win32-x86-64/libtesseract302.dll中的java.class.path。你的类路径的一部分显然包括myproject/target/classes

前缀表示要加载的共享库的平台和体系结构,允许将不同目标的共享库包含在同一个归档中。如果JNA无法在系统加载路径中找到所请求的库名称,则它会尝试在您的资源路径中找到它(如果需要,将其解压缩)。因此,如果您将DLL放在jar文件中,则需要为其添加win32-x86-64前缀以便加载它。

“资源路径”名义上是你的阶级路径;几乎任何地方都可以通过ClassLoader.getResource()到达。


4
投票

该错误源于您尝试在64位JVM中加载32位DLL。可能的解决方案是切换到32位JVM;或者,使用64-bit Tesseract and Leptonica DLLs


2
投票

为什么不使用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/aaac:\\abcv\\aaa\\

如果你想要更简单的方法,只需将所有必要的dll文件放入你的windows32文件夹,JVM就会照顾它。

另一个问题可能是您未正确安装应用程序或应用程序版本与您的jar版本无法匹配。尝试安装最新的应用程序并下载最新的jar再试一次。希望能帮助到你 :)


2
投票

有同样的问题,用以下行排序

System.load( “在/ usr / local / lib目录/ liblept.so.5”)

的System.loadLibrary( “正方体”)

对于您的情况,它可能是不同的库,但最终几乎是相同的:只需手动加载您需要的库。


0
投票

我有同样的问题,发现这个“资源路径”不是由“本机目录路径”设置的。 但是,您可以使用“库”选项卡中的“添加外部类文件夹”向其添加新文件夹,即使此文件夹不包含任何类文件,也包含本机库文件(如Windows上的DLL)


0
投票

几天前,当我尝试使用JNA加载C ++ DLL时,我遇到了同样的错误消息。事实证明,原因是我的DLL所依赖的DLL丢失。

在我的情况下,它是MS Visual Studio 2012可再发行组件,然后我下载并安装在机器上,问题就消失了。尝试使用Dependency Walker查找任何缺少的库并安装它们。


0
投票

我遇到了类似的问题,我尝试了上面的所有答案,但它没有解决我的问题,最后我检查了我从哪里得到了dll的源,发现我没有安装windows redistributable 2012,dll是使用它,一旦我安装它,异常就消失了。

© www.soinside.com 2019 - 2024. All rights reserved.