注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

love3400wind的blog

like

 
 
 

日志

 
 
 
 

java代码中设置java.library.path  

2013-12-14 15:10:15|  分类: IT |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在使用JNI实现zlib压缩的时候需要load动态库文件,我将.so文件放置在项目的lib目录下,所以希望能指定动态库文件加载路径,一般通过VM参数 -Djava.library.path=lib 就可以正常启动程序,但是这样必须在所有用到此模块的程序的启动脚本中添加这项,感觉不好,发现

  1. System.setProperty("java.library.path""./lib");  

     本以为可以在代码中指定动态库文件加载路径了,但是程序报错 java.lang.UnsatisfiedLinkError:  

     并未找到动态库文件找到动态库文件,主要原因是java.library.path属性只在jvm启动时加载一次,原因就在ClassLoader.loadLibrary()方法,usr_paths的值自第一次加载后不会改变了。


  1. if (sys_paths == null) {     
  2.         usr_paths = initializePath("java.library.path");     
  3.         sys_paths = initializePath("sun.boot.library.path");     
  4. }     
  解决方法:在网上找到利用java反射机制,修改usr_paths的值 ,贴上代码

  1. public static void addDir(String s) throws IOException {     
  2.     try {     
  3.         Field field = ClassLoader.class.getDeclaredField("usr_paths");     
  4.         field.setAccessible(true);     
  5.         String[] paths = (String[])field.get(null);     
  6.         for (int i = 0; i < paths.length; i++) {     
  7.             if (s.equals(paths[i])) {     
  8.                 return;     
  9.             }     
  10.         }     
  11.         String[] tmp = new String[paths.length+1];     
  12.         System.arraycopy(paths,0,tmp,0,paths.length);     
  13.         tmp[paths.length] = s;     
  14.         field.set(null,tmp);     
  15.     } catch (IllegalAccessException e) {     
  16.         throw new IOException("Failed to get permissions to set library path");     
  17.     } catch (NoSuchFieldException e) {     
  18.         throw new IOException("Failed to get field handle to set library path");     
  19.     }     
  20. }     
     jvm必须是用usr_paths变量来保存java.library.path的值此方法才可行。修改过后,程序运行良好大笑


  评论这张
 
阅读(307)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017