java.lang.UnsatisfiedLinkError: C:\Users\Administrator\AppData\Local\Temp\alglib.dll

本文主要是介绍java.lang.UnsatisfiedLinkError: C:\Users\Administrator\AppData\Local\Temp\alglib.dll,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、问题
  • 二、分析
    • 1、源码调试
    • 2、.dll文件
      • 2.1、dll是什么
      • 2.2、dll依赖项
    • 3、JNI
    • 4、dll文件缺少依赖项
  • 三、解决
    • 1、下载依赖dll
    • 2、最终解决


一、问题

最近在做一个和第三方系统对接的需求。需要对入参进行对称加密。第三方提供了一个jar包,单元测试其中的加密方法时报错:

java.lang.UnsatisfiedLinkError: C:\Users\Administrator\AppData\Local\Temp\alglib7079975575154469256.dll: Can't find dependent librariesat java.lang.ClassLoader$NativeLibrary.load(Native Method)at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)at java.lang.Runtime.load0(Runtime.java:809)at java.lang.System.load(System.java:1086)at com.ztoon.core.AlgorithmHolder.<clinit>(AlgorithmHolder.java:71)at com.ztoon.core.alg.asymmetric.ECC256.privateSign(ECC256.java:29)at com.ztoon.core.alg.asymmetric.AsymmetricAlgorithmWrapper.privateSign(AsymmetricAlgorithmWrapper.java:35)at cn.gwssi.grant.audit.service.impl.BlockChainServiceImpl.sendHttpRequestByMap(BlockChainServiceImpl.java:547)at cn.gwssi.grant.audit.service.impl.BlockChainServiceImpl.getFromHaiDian(BlockChainServiceImpl.java:438)at cn.gwssi.grant.audit.service.impl.BlockChainServiceImpl$$FastClassBySpringCGLIB$$f28441a9.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at com.alibaba.druid.support.spring.stat.DruidStatInterceptor.invoke(DruidStatInterceptor.java:72)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)at cn.gwssi.grant.audit.service.impl.BlockChainServiceImpl$$EnhancerBySpringCGLIB$$12854599.getFromHaiDian(<generated>)at cn.gwssi.grant.audit.service.impl.BlockChainServiceImplTest.testGetFromHaiDian(BlockChainServiceImplTest.java:47)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

二、分析

1、源码调试

这个错误是从没见过的,首先调试一下jar包里的源码

在这里插入图片描述

分析一下这个源码的逻辑:

  • 判断操作系统是windows、mac还是Linux,加载不同的动态链接库(DLL)
  • 将jar包里的.dll文件复制到本地
  • System.load(f.toString()):装载dll文件

错误就产生在 System.load(f.toString())


2、.dll文件

2.1、dll是什么

首先看一下.dll文件是什么?

DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和其他资源。Windows提供的DLL文件中包含了允许基于Windows的程序在Windows环境下操作许多共享的函数和资源。

DLL文件中存放的是各类程序的函数(子过程)实现过程,当程序需要调用函数时需要先载入DLL,然后取得函数的地址,最后进行调用。使用DLL文件的好处是程序不需要在运行之初加载所有代码,只有在程序需要某个函数的时候才从DLL中取出。另外,使用DLL文件还可以减小程序的体积。


2.2、dll依赖项

当某个程序或 DLL 使用其他 DLL 中的 DLL 函数时,就会创建依赖项。 因此,该程序就不再是独立的,并且如果该依赖项被损坏,该程序就可能遇到问题。 例如,如果发生下列操作之一,则该程序可能无法运行:

  • 依赖 DLL 升级到新版本。
  • 修复了依赖 DLL。
  • 依赖 DLL 被其早期版本覆盖。
  • 从计算机中删除了依赖 DLL。

3、JNI

装载dll文件,这就涉及到另一个知识点:JNI

JNI是Java Native Interface的缩写,指的Java调用本地方法(native method)。本地方法一般是用其它语言(C、C++或汇编语言等)编写的,并且被编译为基于本机硬件和操作系统的程序。

为什么要用本地方法?

因为Java是编译型语言,需要先编译,再运行,虽然有跨平台的好处,但难免效率会低一些。有一些对硬件的操作,Java可能也做不了。所以,这时候就要用Java去调用 C/C++等写的代码。

从结构上来看JNI是一个中间层,具体的调用步骤是这个样子的:java->JNI->C/C++。

在这里插入图片描述

在windows下可以将C/C++程序编译成.dll文件,然后被JNI调用。

可以看一下本地的jdk,里面也有很多动态链接库,Java的很多native方法就是通过这种方式实现的。

在这里插入图片描述


4、dll文件缺少依赖项

经过断点排查分析,

  • jar包中的dll文件复制到了本地
  • 本地的路径和Java加载路径相同

最后觉得:

  • 可能是dll文件缺少依赖项

所以需要查看dll依赖,这里用到了一个工具:Dependency Walker

在这里插入图片描述
用 Dependency Walker 打开 dll文件
在这里插入图片描述

结果发现确实缺少很多依赖项:

在这里插入图片描述


三、解决

1、下载依赖dll

刚开始的解决思路是找到这些缺少的dll,把它们复制到dll相同目录下,找到了一个网站:dll-files.com

在这里插入图片描述

找到了一些缺失的dll,但博主缺失的实在太多了,很多根本找不到。

这是候怀疑是本地windows的环境问题,已经在考虑重装系统了。


2、最终解决

柳暗花明又一村。

最后问题还是解决了——第三方jar包里的dll缺失有一些依赖项,需要手动把这些依赖项拷贝到 文件放入C:\Windows\System32 目录下。

在这里插入图片描述

但是交接人员不太清楚,忘了!

在这里插入图片描述



参考:

【1】:Java load 和 loadlibrary方法的区别
【2】:JNI系列教程一:入门
【3】:什么是dll
【4】:查看dll依赖的工具 dll缺少解决办法 depends使用
【5】:java.lang.UnsatisfiedLinkError: C:\Users\admin\AppData\Local\Temp\librocksdbjni5734698881557363843.dll

这篇关于java.lang.UnsatisfiedLinkError: C:\Users\Administrator\AppData\Local\Temp\alglib.dll的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/423455

相关文章

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp