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)