`
talentluke
  • 浏览: 604367 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java调用dll的路径问题解决

 
阅读更多
前言:一般我们在用java写jni类库的时候,总是得把生成的dll放在java.library.path所指定的目录下,例如%WINDOWS%\system32,然而通过手动设置setProperties("java.library.path",yourpath),并不能正常使用。所以只能在项目的发布期间拷贝才能正常使用,非常麻烦,有时因经常变动,还会忘记拷贝,导致程序出现错误。
笔者在经过网上的搜索,加上自己的实践,找到不用拷贝dll,也可以动态加载的方式,以此备注。
原理:由于ClassLoader里加载环境变量是只初始化一次,所以在此以后的所有设置将不起作用。看了网上一篇文章,原来可以读dll文件,并把它写到java.library.path的目录下,并通过System.load()进行动态加载,就可以实现不用拷贝也可以实现。代码示例:
//注:ConvertWord2HM是我的类名称
    private static void setLibrary() {
  try { 
        String libFileName = "Convert.dll";//dll 文件
        //获取到java.library.path
          String libpath = System.getProperty("java.library.path");   
          if ( libpath==null || libpath.length() == 0 ) {   
              throw new RuntimeException("java.library.path is null");   
          }   
                 
          String path = null;   
          StringTokenizer st = new StringTokenizer(libpath, System.getProperty("path.separator"));   
          if ( st.hasMoreElements() ) {   
              path = st.nextToken();   
          } else {   
              throw new RuntimeException("can not split library path:" + libpath);   
          }   
          //把dll文件写入到java.library.path中该dll放在ConvertWord2HM相同目录下,这个可以是你的类名
          InputStream inputStream = ConvertWord2HM.class.getResource(libFileName).openStream();   
          final File dllFile = new File(new File(path), libFileName);   
          if (!dllFile.exists()) {   
              FileOutputStream outputStream = new FileOutputStream(dllFile);   
              byte[] array = new byte[8192];   
              int bytesRead = -1;
     while(bytesRead = inputStream.read(array)!=-1){
      outputStream.write(array,0,bytesRead);
     }  
     outputStream.flush();
              outputStream.close();   
          }
          //动态加载dll
          System.load(dllFile.getPath());
         
          //在虚拟机关闭的时候删除dll
          dllFile.deleteOnExit();
      
      } catch (Throwable e) {   
              throw new RuntimeException("load Convert.dll error!", e);   
   }
    }
   你可以把它放在static块中,这样只需加载一次。方便以后的使用。
分享到:
评论

相关推荐

    JAVA调用DLL方法 JAVA调用DLL方

    ### JAVA调用DLL方法 在跨平台开发领域中,Java作为一种强大的编程语言,因其具有良好的移植性和跨平台性而被广泛使用。然而,在某些特定情况下,我们可能需要调用本地库(例如DLL文件)来实现特定功能或提高性能。...

    java调用DLL文件

    总结来说,Java调用DLL文件主要依赖于JNative库,通过定义Java接口、加载DLL、获取函数句柄、创建代理对象以及调用函数等步骤实现。这种方法使得Java开发者能够充分利用C/C++库的功能,同时也保持了Java的跨平台特性...

    jna jar实现java调用dll

    JNA是实现Java调用DLL的关键工具,DLL是Windows操作系统中的本地库,而“java调用dll”是整个过程的目标。 在压缩包子文件的文件名称列表中,只有一个文件名"testmj"。通常,这可能是一个测试类或者包含主方法的...

    java调用C#封装的dll方法

    ### Java调用C#封装的DLL方法 #### 第一种方法:Java利用JNA进行调用 **背景介绍:** 为了实现Java与C#之间的交互,一种常用的方式是通过调用C#封装的DLL文件来完成特定功能。这种方法涉及到.NET Framework与Java...

    java调用dll必备jar包

    Java调用DLL(动态链接库)是Java编程中的一项高级技术,主要应用于Java与本地代码交互,例如在Java中利用C++或C编写的库。本文将详细介绍如何使用Java调用DLL以及所需的必备jar包。 首先,Java并不直接支持DLL的...

    Java调用DLL例子

    本示例以"Java调用DLL例子"为主题,使用了JNative库作为接口来实现Java调用本地动态链接库。 JNative是一个开源的Java库,它提供了一种方法使得Java程序能够直接调用C/C++编写的函数,从而间接实现了调用DLL的功能...

    Java调用dll文件开源组件jar包及说明文档

    Java调用DLL文件是软件开发中的常见需求,尤其是在Java与C/C++混合编程时。`JNative-1.3.2`是一个开源组件,专门设计用于帮助Java应用程序调用Windows平台上的DLL(动态链接库)文件,同时也支持Linux平台下的SO...

    Jna调用dll实例

    这个实例是关于如何使用JNA来调用DLL(动态链接库)的教程,特别强调了在调用过程中可能出现的中文乱码问题以及如何解决这个问题。 首先,我们需要理解JNA的工作原理。JNA通过提供一个接口定义,让Java代码能够映射...

    java实例,通过jawin实现对dll中方法的调用

    jawin.jar包含了Java接口,jawin.dll则是Java与DLL交互的桥梁,它实现了Java和C/C++之间的互操作性,使得Java程序员可以方便地调用DLL中的函数。 首先,我们需要理解Java与DLL交互的基本概念。在Java中,我们通常...

    非常好用java调用c++ dll文件demo

    5. **调用DLL方法**:现在,Java程序可以通过JNI接口调用DLL文件中的函数。 在提供的"java_dll_sample"压缩包中,可能包含以下元素: - `Java调用C++ DLL的Java类`:这个类会声明`native`方法,并在运行时通过`...

    JNA方式实现Java调用dll的必用jar包

    标题"JNA方式实现Java调用dll的必用jar包"指的是使用JNA库来调用Windows平台上的动态链接库(.dll文件)所需的Java类库。这个"jna5.jar"文件是JNA的一个版本,其中包含了所有必要的组件,使得Java程序能够通过JNA...

    Java调用DLL的工具 JNative

    Java调用DLL的工具JNative是为了解决Java应用程序与本地动态链接库(DLL)交互问题而设计的一个开源组件。在传统的Java开发中,如果需要调用非Java编写的库,比如C或C++编译的DLL,通常会使用JNI(Java Native ...

    JAVA如何调用dll:用JNI调用C或C++动态联接库

    Java 调用DLL(动态链接库)主要是通过JNI(Java Native Interface)技术来实现的。JNI是Java平台标准的一部分,允许Java代码和其他语言写的代码进行交互。在本例中,我们将详细介绍如何使用JNI调用C或C++编写的DLL...

    在Java程序中使用JNative调用dll文件

    在Java程序中调用DLL(动态链接库)文件通常是通过JNI(Java Native Interface)来实现的,而JNative是JNI的一个封装库,它提供了一种更简洁的方式来调用C/C++编写的本地代码。这篇博客文章可能介绍了如何利用...

    JAVA JNI调用DLL完整步骤

    总结,Java调用DLL的完整步骤包括:定义Java的`native`方法,使用`javah`生成头文件,编写C/C++ DLL代码,编译DLL,最后在Java程序中调用。这个过程可能需要对JNI规范有深入理解,以及一定的C/C++编程基础。通过熟练...

    java调用dll详解.rar

    总之,通过Java调用DLL虽然过程复杂,但可以充分利用已有的本地代码资源。理解JNI的工作原理和注意事项,能帮助开发者更好地在Java项目中集成DLL功能。希望这个资源对大家的学习和项目开发有所帮助,让我们共同进步...

    Java中调用动态库dll的方法 源代码

    注意,为了能在不同系统上运行,可能需要处理路径和库名的问题,比如使用`System.loadLibrary()`加载动态库。 通过上述步骤,你可以在Java中成功地调用动态库DLL。不过,这种方式可能会增加项目的复杂性,且跨平台...

    java调用c++ dll的示例

    在提供的压缩包"java调用dll示例"中,可能包含了Java源代码、C++源代码、生成的DLL文件以及相关的构建和运行脚本。通过研究这些示例,你可以更深入地了解如何将这些步骤应用于实际项目中。理解并掌握这一技术对于...

    关于jda调用dll的路径问题和测试样例

    在“关于jda调用dll的路径问题和测试样例”这个主题中,我们主要讨论的是如何在JDA中正确配置和使用动态链接库(DLL)文件,以及解决可能出现的路径问题。DLL文件通常包含可由多个程序共享的代码和数据,因此在Java...

    NetBetBeans 编写Java调用DLL代码

    本教程将深入探讨如何使用NetBeans IDE来编写Java程序,以便调用DLL。 首先,理解JNI的基本概念至关重要。JNI是Java平台的一部分,它提供了一种标准方法,让Java代码可以调用本地函数库,反之亦然。JNI头文件和源...

Global site tag (gtag.js) - Google Analytics