打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
在Jar包中打入DLL文件并调用的方式
  1. //加载test.dll   
  2. System.loadLibrary("test");   
  3. System.load("test");  

 

需要说明的是加载DLL的有效路径与一个JVM中的系统变量有关,可以用以下方法查看该变量。

  1. System.getProperty("java.library.path");  

 

在该变量中含有当前路径".",需要特别说明,这个当前路径是执行时的当前路径,举例来说。

  1. //当前路径在C:根目录下,而执行的程序在C:/app/Test.class   
  2. C:\> java app/Test //这时的 . 表示的是C:\   
  3. C:\app> java Test  //这时的 . 表示的是C:\app  

 

接下来就是重点了,DLL已经打包到了JAR中,比如打进了APP.jar,那对于Windows来说,这个DLL不存在于任何的目录中,自然无法正常调用到。那解决方法就是在执行的时候将JAR包中的DLL解到某个地方,然后再载入。因为使用下面的代码可以将JAR包中的任何文件作为资源载入。

  1. MyClass.class.getResourceAsStream(dllName);     MyClass.class.getResource(dllName);  

 

这样就可以在JAR包执行时把DLL读取出来解在一个地方了,我写了一个方法来代替loadLibrary,DLL会被放入系统的临时文件夹中,在那里会被载入,synchronized保证该过程在多线程下安全,也许在将来可以优化。

  1. //BIN_LIB为JAR包中存放DLL的路径   
  2. //getResourceAsStream以JAR中根路径为开始点   
  3. private synchronized static void loadLib(String libName) throws IOException {   
  4.     String systemType = System.getProperty("os.name");   
  5.     String libExtension = (systemType.toLowerCase().indexOf("win")!=-1) ? ".dll" : ".so";   
  6.        
  7.     String libFullName = libName + libExtension;   
  8.        
  9.     String nativeTempDir = System.getProperty("java.io.tmpdir");   
  10.        
  11.     InputStream in = null;   
  12.     BufferedInputStream reader = null;   
  13.     FileOutputStream writer = null;   
  14.        
  15.     File extractedLibFile = new File(nativeTempDir+File.separator+libFullName);   
  16.     if(!extractedLibFile.exists()){   
  17.         try {   
  18.             in = SMAgent.class.getResourceAsStream(BIN_LIB + libFullName);   
  19.             if(in==null)   
  20.                 in =  SMAgent.class.getResourceAsStream(libFullName);   
  21.             SMAgent.class.getResource(libFullName);   
  22.             reader = new BufferedInputStream(in);   
  23.             writer = new FileOutputStream(extractedLibFile);   
  24.                
  25.             byte[] buffer = new byte[1024];   
  26.                
  27.             while (reader.read(buffer) > 0){   
  28.                 writer.write(buffer);   
  29.                 buffer = new byte[1024];   
  30.             }   
  31.         } catch (IOException e){   
  32.             e.printStackTrace();   
  33.         } finally {   
  34.             if(in!=null)   
  35.                 in.close();   
  36.             if(writer!=null)   
  37.                 writer.close();   
  38.         }   
  39.     }   
  40.     System.load(extractedLibFile.toString());   
  41. }  

 


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java 使用 Tess4J 进行 图片文字识别 笔记
关于serveletContext.getRealPath()方法
精简出最小 jre
Java获取Jar包路径
Jar文件高级应用指南
在运行期动态加载jar包/class目录
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服