public class Nox2Key
{    public Nox2Key()
    {
    }    public native int NoxGetLastError();    public native int NoxFind(int i, int ai[], int ai1[]);    public native int NoxOpen(int i, String s);    public native int NoxReadStorage(int i, int j, byte abyte0[]);    public native int NoxWriteStorage(int i, int j, byte abyte0[]);    public native int NoxReadMem(int i, byte abyte0[]);    public native int NoxWriteMem(int i, byte abyte0[]);    public native int NoxClose(int i);    static 
    {
        System.loadLibrary("Nox2AppJ");
    }
}上面是个class,我在另外一个java程序里面要调用这个类,但是这个类加载时会载入“Nox2AppJ”这个dll文件,第一次加载系统执行正常,第二次再运行我的java程序时,系统又调用了一次这个类,又加载了一次dll文件,然后jvm报错,说已经加载过了,抛出异常,不执行了。请问如何只加载一次调用,然后下次再调用这个类时不再载入dll文件?

解决方案 »

  1.   

    报错“java.lang.UnsatisfiedLinkError:Native Library C:\windows\Nox2AppJ.dll already loaded in another classloader”.
      

  2.   

    dll 被系统已经装载了,下次就不用装了?你可以catch 这个装载代码。另外,你也可以尝试卸载dll看看
      private void unloadNativeLibs() throws Throwable {
        ClassLoader classLoader = this.getClass().getClassLoader();
        Field field = ClassLoader.class.getDeclaredField("nativeLibraries");
        field.setAccessible(true);
        Vector libs = (Vector) field.get(classLoader);
        Iterator it = libs.iterator();
        Object o;
        while (it.hasNext()) {
          o = it.next();
          System.out.println(o);
          Method finalize = o.getClass().getDeclaredMethod("finalize", new Class[0]);
          finalize.setAccessible(true);
          finalize.invoke(o, new Object[0]);
        }
      }
    }
      

  3.   

    试了一下,楼上的代码有问题。报错“java.lang.SecurityException:禁止访问类class java.lang.ClassLoader中的成员”,这个怎么处理?
      

  4.   

    已经解决,谢谢大家的支持!
    是web服务器的编译问题。放到servlet中就没问题了,换一种解决方案,呵呵。
      

  5.   

    现在我也碰到dll库重复加载的问题,困扰很久了。请楼上把解决的详细方法发一下,非常感谢!!