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

相关文章

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原