JAVA && java.lang.UnsatisfiedLinkError: The specified module could not be found.找不到指定模块

本文介绍了解决Java调用C语言接口时出现的DLL依赖错误的方法。通过使用DependencyWalker工具检查DLL依赖关系,并下载缺失的UCRTBASED.DLL文件来解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 前言

java对接C,引用到了 jna,报出如下错误

java.lang.UnsatisfiedLinkError: The specified module could not be found.

Exception in thread "main" java.lang.UnsatisfiedLinkError: The specified module could not be found.
at com.sun.jna.Native.open(Native Method)
at com.sun.jna.Native.open(Native.java:1759)
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:260)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398)
at com.sun.jna.Library$Handler.<init>(Library.java:147)
at com.sun.jna.Native.loadLibrary(Native.java:412)
at com.sun.jna.Native.loadLibrary(Native.java:391)
Exception in thread "main" java.lang.UnsatisfiedLinkError: 找不到指定模块.
at com.sun.jna.Native.open(Native Method)
at com.sun.jna.Native.open(Native.java:1759)
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:260)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398)
at com.sun.jna.Library$Handler.<init>(Library.java:147)
at com.sun.jna.Native.loadLibrary(Native.java:412)
at com.sun.jna.Native.loadLibrary(Native.java:391)

2. 思路

各种百度 google 所有方法都试了,错误还是没法解决。
项目源码 如下图 dll 动态执行库
java.lang.UnsatisfiedLinkError出现这种错误的原因是一般是java虚拟机找不到声明为native方法的本地语言定义时,出现的错误。在我的理解过程中我一般都认为是由于导入dll或者导入lib文件不正确导致的.
遂思路转向 gtp.dll 的依赖 参考github tess4j issues发现神器 Dependency Walker

在这里插入图片描述

3. 神器 Dependency Walker

Dependency Walker 官方网站http://www.dependencywalker.com/
Dependency Walker 是 Microsoft Visual C++ 中提供的非常有用的 PE 模块依赖性分析工具。主要功能如下:
查看 PE 模块的导入模块。
查看 PE 模块的导入和导出函数。
动态剖析 PE 模块的模块依赖性。
解析 C++ 函数名称。
Dependency Walker 使用说明 http://www.dependencywalker.com/help/html/contents.htm

在这里插入图片描述

下载好了之后

在这里插入图片描述


打开 depends.exe

左上角 file --》 open --》 选择 调用的 dll 文件

在这里插入图片描述

果不其然发现动态库组件 缺失 黄色叹号

在这里插入图片描述

4. 下载 dll文件

在这里插入图片描述

4.1 下载UCRTBASED.DLL

参考如何解决vs2015运行缺少ucrtbased.dll的问题下载UCRTBASED.DLL
https://jingyan.baidu.com/article/1e5468f96a8048484861b711.html

4.1.1 搜索UCRTBASED.DLL

在这里插入图片描述

4.1.2 下载保存UCRTBASED.DLL

在这里插入图片描述

在这里插入图片描述

4.1.3 解压到指定目录

在这里插入图片描述

  • 1、Windows 95/98/Me系统,将ucrtbased.dll复制到C:\Windows\System目录下。
  • 2、Windows NT/2000系统,将ucrtbased.dll复制到C:\WINNT\System32目录下。
  • 3、Windows XP/WIN7/win10系统
    如果您的系统是 64位 的请将ucrtbased.dll文件复制到C:\Windows\SysWOW64目录下,
    如果您的系统是 32位 的请将ucrtbased.dll文件复制到C:\Windows\System32目录下。
    具体的方法可以参考这篇文章:win7 64位旗舰版系统运行regsvr32.exe提示版本不兼容

安装所有依赖

参考 第四部下载 dll文件安装所有依赖

在这里插入图片描述

结束


当你在Java中使用Tesseract库时,如果遇到`java.lang.UnsatisfiedLinkError: 不到指定模块`错误,通常是因为系统无法到Tesseract的本地库文件。以下是一些可能的解决方案: 1. **确保本地库文件存在**: - 确保Tesseract的本地库文件(如`tesseract.dll`、`libtesseract.so`等)已经正确安装,并且路径已经添加到系统的环境变量中。 2. **设置库路径**: - 在Java程序中手动设置本地库的路径。例如: ```java System.setProperty("jna.library.path", "/path/to/tesseract/libs"); ``` 3. **检查系统架构**: - 确保本地库文件与操作系统的架构(如32位或64位)匹配。例如,64位的Java虚拟机需要64位的本地库文件。 4. **使用JNA或JNI**: - 确保你使用的Java库(如JNA或JNI)正确配置,并且能够到本地库文件。 5. **环境变量**: - 将Tesseract的本地库路径添加到系统的环境变量中,如`PATH`(Windows)或`LD_LIBRARY_PATH`(Linux)。 以下是一个示例代码,展示了如何设置库路径并初始化Tesseract: ```java import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.TesseractException; public class TesseractExample { public static void main(String[] args) { // 设置库路径 System.setProperty("jna.library.path", "/path/to/tesseract/libs"); Tesseract tesseract = new Tesseract(); tesseract.setDatapath("/path/to/tessdata"); try { String result = tesseract.doOCR("path/to/image.png"); System.out.println(result); } catch (TesseractException e) { e.printStackTrace(); } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dendysan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值