`
sylar029
  • 浏览: 78923 次
社区版块
存档分类
最新评论

关于java用jni调用 dll动态库Can't find dependent libraries错误的解决

 
阅读更多

       最近在做一些java开发的时候,需要调用操作系统底层的一些东西,所以我用c++ 写了一个dll动态库文件,通过java的JNI进行调用。dll 文件生成之后 在本机用java调用没有问题,  但是换了一台主机就报错了,报错如下:

java.lang.UnsatisfiedLinkError: D:\workspace_bsp\myzauto\lib\getcpu.dll: Can't find dependent libraries。

       大概意思是找不到依赖库。

       由于是第一次用java调用dll动态库,所以不知道这个问题该怎么解决。在网上查了半天都没有结果,网上也没有解决方案。只知道缺少依赖的dll 。 但是我不知道  缺少哪些动态库。于是我就从想办法找如何查找缺失依赖库的办法,终于在网上找到一个工具,可以查看你所用的 dll的依赖库,如我的(getcpu.dll)。

工具的名字为《DLL依赖查看工具》。见附近下载。

        解压, 双击打开DLL依赖查看工具 ,打开你得dll文件(如:getcpu.dll);显示结果如图(见附件,由于不知道怎么插入图片)

图片中带有黄色问号的是缺失的dll文件, 你在网上下载缺失的 dll文件(例如我缺失的 MSVCRTD.dll 和 MFC42D.dll)。

下载地址:  http://www.dllbang.com/

       下载成功后,加载进去,或者放在 system32目录下。 即可。然后 再用java调用getcpu.dll 就成功了。

        之前没加缺失dll库文件时的代码:

        package com.bsp.zauto.common;

public class JavaNativeCall {

    static {  
        System.load(System.getProperty("user.dir")+"/lib/getcpu.dll");   
    }   
    
    public native int getCpuUsageRatio(int cputime);  
 /**
  * @method main
  * @return void
  * @date 2011-9-12 下午06:39:19
  * @param args
  * @decription (描述)
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  JavaNativeCall jc = new JavaNativeCall();
  System.out.println(jc.getCpuUsageRatio(1000));
 }
}

 

运行报错:

java.lang.UnsatisfiedLinkError: D:\workspace_bsp\myzauto\lib\getcpu.dll: Can't find dependent libraries。

 

加载后代码:

package com.bsp.zauto.common;

public class JavaNativeCall {

    static {  
        System.load(System.getProperty("user.dir")+"/lib/MSVCRTD.dll");  
        System.load(System.getProperty("user.dir")+"/lib/MFC42D.dll");  
        System.load(System.getProperty("user.dir")+"/lib/getcpu.dll");   
    }   
    
    public native int getCpuUsageRatio(int cputime);  
 /**
  * @method main
  * @return void
  * @date 2011-9-12 下午06:39:19
  * @param args
  * @decription (描述)
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  JavaNativeCall jc = new JavaNativeCall();
  System.out.println(jc.getCpuUsageRatio(1000));
 }
}

 运行成功。

这个问题网上没有明确解决帖子,研究了半天才解决。写此文章,望大家少走弯路。

注意事项:

1:依赖库的顺序。

        System.load(System.getProperty("user.dir")+"/lib/MSVCRTD.dll"); 
        System.load(System.getProperty("user.dir")+"/lib/MFC42D.dll"); 
        System.load(System.getProperty("user.dir")+"/lib/getcpu.dll");  

     这个顺序须按照你的调用依赖库的顺序排列。 如果顺序写反了,依然会报 Can't find dependent libraries的错。

     所以,如果把所需的依赖库都加载了,还报错,试着修改这几个依赖库的顺序。

2:dll文件的下载地址:

      http://www.dllbang.com/

      这个网站可以搜索,下载你所需的dll动态库。

  • 大小: 3 KB
分享到:
评论
14 楼 蓝境海天 2018-04-12  
博主,你的附件“DLL依赖查看工具.rar”版本太旧了,是1998年的。很多DLL都会报找不到Import Directory的错误。开始我还以为是DLL的问题。后来下载了一个较新的depends22_x64.zip,看到了缺少的依赖DLL。

在这里还是要感谢博主,使用你的方法确实解决了我的问题。
13 楼 hardToMe 2017-05-12  
同顶5楼,安装对应版本的VC++运行库成功解决了
12 楼 hzylmf 2016-06-29  
顶5楼,装vc++运行库就行了
11 楼 zhxmk 2016-06-02  
看到有人不知道依赖哪些DLL把能够搜索到的dll都放到JDK中,我也醉了。这个工具不错
10 楼 江南侠客 2015-12-30  
非常感谢,按思路解决了我的问题
9 楼 1298391314 2015-03-31  
8 楼 mnizzl 2014-12-02  
多谢楼主,解决了!!!
居然会有这种情况
7 楼 noddle0592 2014-08-23  
刚好碰到这个问题,用这种方法解决了,多谢lz
6 楼 gufengyy 2014-05-26  
谢谢,帮助解决了我遇到的问题
5 楼 xiaohuafyle 2013-12-03  
微软官方的解释是这样的

建议您把project类型改为release 版再部署,请不要直接deploy debug版的可执行文件。

对于release版本部署,您可以在电脑上安装Visual C++ Redistributable for Visual Studio 2012 package 其中含有需要的MSVCP110.dll文件。
4 楼 aigo 2013-07-24  
多谢博主分享,我也正好遇到同样问题
3 楼 sylar029 2013-02-26  
dansantan 写道
您好,我最近通过jni调用c++ 写了一个dll动态库文件,但是出现如下错误,Exception in thread "main" java.lang.UnsatisfiedLinkError: 在网上查了资料说是,一定要是.c文件健dll?请问可以以cpp文件健吗?

不好意思,我对c++研究的不是很深,具体我也不太清楚,如果你研究出来了,可以分享下。
2 楼 dansantan 2012-10-12  
您好,我最近通过jni调用c++ 写了一个dll动态库文件,但是出现如下错误,Exception in thread "main" java.lang.UnsatisfiedLinkError: 在网上查了资料说是,一定要是.c文件健dll?请问可以以cpp文件健吗?
1 楼 liutie5 2012-08-09  
感谢楼主,按照你的思路解决了问题。

相关推荐

    Java通过JNI调用DLL动态库

    Java通过JNI调用DLL动态库,亲测试编写

    JAVA项目JNI调用dll实现DEMO源码,C++&JAVA

    完整的实现java跨平台调用C程序源码,包含JAVA源码和C源码以及编译后的demo dll。将dll放到jdk bin目录下,java 项目可以直接运行。若要修改dll可以,修改C源码后重新编译生成dll。该demo处理了多线程调用c,全局...

    JAVA通过JNI调用C#dll的整个项目工程

    使用`System.loadLibrary`加载C++编译生成的动态链接库,然后就可以在Java代码中调用本地方法,间接实现对C# DLL的调用。 7. **测试与调试**: 创建一个简单的Java应用程序来调用这些本地方法,测试C# DLL的功能...

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    ### 使用JNA替代JNI调用DLL,并解决内存溢出问题 #### 问题背景 在项目的开发过程中,常常遇到需要处理二进制流数据并对其进行解析处理的情况。这种情况下,如果上层应用平台采用的是Java开发,而底层算法或数据...

    java使用JNI调用C++ dll库用法概述

    Java使用JNI(Java Native Interface)调用C++ DLL库是一种常见的技术,特别是在需要利用Java的跨平台特性同时利用C++的高效性能时。JNI提供了一种桥梁,使得Java代码能够直接与本地代码交互,比如C++编译的动态链接...

    Java JNI调用动态库(Linux、Windows)的实现步骤

    ### Java JNI调用动态库(Linux、Windows)的实现步骤 #### 一、概述 Java Native Interface (JNI) 是一种标准的 Java 接口,它允许 Java 代码和其他语言(如 C 或 C++)编写的代码进行交互。通过 JNI,Java 应用...

    JAVA JNI调用DLL完整步骤

    在某些场景下,比如调用操作系统特定的功能或者利用已有的C/C++库,我们需要使用JNI来实现Java与本地代码(如DLL动态链接库)的交互。本教程将详细介绍如何通过JNI在Java中调用DLL的完整步骤。 1. **创建Java类和...

    java运用jni调用dll实现屏蔽系统热键和任务栏

    Java使用JNI调用DLL来实现系统热键屏蔽与任务栏隐藏是一种跨平台编程技术的应用,主要涉及Java的本地接口(JNI)和Windows API。本文将深入解析这一技术的关键点,并提供相关的知识背景。 首先,JNI(Java Native ...

    Java通过JNI调用C++的DLL文件.docx

    本文的标题“Java 通过 JNI 调用 C++ 的 DLL 文件”表明了文章的主要内容,即使用 JNI 将 Java 应用程序与 C++ DLL 文件集成。 描述解析 文章的描述提供了一个 Demo 文档,描述了如何使用 JNI 将 Java 应用程序与 ...

    Java JNI调用DLL方法

    在本案例中,我们讨论的是如何使用Java JNI调用一个名为"AlarmTTS"的VC(Visual C++)动态链接库(DLL)并进行调试。 首先,我们需要了解Java部分的代码。`CallAlarmTTSDll`类是Java程序的核心,它定义了三个本地...

    JNI--java调用不同平台的动态链接库,dll,so,完美,全教程

    假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 C 语言的数据结构,调用已有的 ? dll/so 中公布的函数。 然后再在 Java...

    Java使用jni接口调用C++动态库.docx

    Java 使用 JNI 接口调用 C++ 动态库 Java 通过使用 JNI(Java Native Interface)接口可以调用 C++ 动态库,该技术可以大大扩展 Java 的能力,让 Java 应用程序可以与其他语言编写的程序进行交互。下面是 Java 使用...

    springboot+jna/jni调用动态so/dll库

    在"JniSpringboot"这个示例项目中,很可能是展示了一个使用Spring Boot启动的应用,同时通过JNI或JNA调用了本地动态库。开发者可以通过阅读源代码,了解如何在实际项目中整合这两种技术来实现跨平台的本地功能调用。

    java连接调用dll动态库

    Java连接调用DLL动态库是将Java编程语言与Windows平台上的动态链接库(DLL)集成的一种技术。在Java中,这种功能通常是通过JNI(Java Native Interface)实现的,它允许Java代码调用C、C++等本地代码,而DLL正是这些...

    java使用JNI调用C++动态链接库(初学必备)

    Java 使用 JNI(Java Native Interface)调用 C++动态链接库是一种常见的技术,它允许 Java 代码与本地 C 或 C++代码交互,以利用 C++的高性能特性或利用已有的 C++库。以下是对标题和描述中涉及的知识点的详细解释...

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单

    JNI允许Java代码和其他语言写的代码进行交互,包括调用C/C++编译的动态链接库(DLL)文件。下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,...

    GMSSL的java调用(JNI库和调用实例).zip

    5. **Java端的JNI调用**:在Java代码中加载动态库,然后通过`System.loadLibrary()`方法调用相应的JNI函数。 在实际应用中,开发人员需要考虑兼容性问题,如不同操作系统下的动态库加载方式、32位与64位系统的差异...

    利用JNI实现Java调用C++库

    利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。 详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)

    Java调用动态链接库(Java 调用 DLL)

    Java调用动态链接库(DLL)是Java编程中一个比较特殊的技术,主要涉及到Java与本地代码的交互。在Windows系统中,DLL(Dynamic Link Library)是实现函数复用的一种方式,它包含了一系列可供其他程序调用的函数或数据...

    Java JNI调用IC卡读卡器

    在这个场景中,我们需要通过JNI来调用IC卡读卡器的DLL(动态链接库),该DLL可能是由非Java语言编写的,以实现与IC卡的通信。 首先,我们需要理解DLL的作用。DLL文件是Windows操作系统中的一个可执行文件,其中包含...

Global site tag (gtag.js) - Google Analytics