java 卸载动态链接库

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Vector;

public class FreeDynamicDll {
 static {
  // 首先确保这些dll文件存在
  System.load("c:/test/Decode.dll");
 }

 /**
  * 卸载已经装载的dll
  * 
  * @param dllName
  *            库名,如Decode.dll
  */
 

 private synchronized void freeDll(String dllName) {
  try {
   ClassLoader classLoader = this.getClass().getClassLoader();
   Field field = ClassLoader.class.getDeclaredField("nativeLibraries");
   field.setAccessible(true);
   Vector<Object> libs = (Vector<Object>) field.get(classLoader);
   Iterator<Object> it = libs.iterator();
   Object o;
   while (it.hasNext()) {
    o = it.next();
    Field[] fs = o.getClass().getDeclaredFields();
    boolean hasInit = false;
    for (int k = 0; k < fs.length; k++) {
     if (fs[k].getName().equals("name")) {
      fs[k].setAccessible(true);
      String dllPath = fs[k].get(o).toString();
      if (dllPath.endsWith(dllName)) {
       hasInit = true;
      }
     }
    }
    if (hasInit) {
     Method finalize = o.getClass().getDeclaredMethod(
       "finalize", new Class[0]);
     finalize.setAccessible(true);
     finalize.invoke(o, new Object[0]);
     it.remove();        
     libs.remove(o);
    }
   }

  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 
 public static void main(String args[]) {
  FreeDynamicDll t = new FreeDynamicDll();
  t.freeDll("Decode.dll");
 }
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值