我写了JNI类(Registry类)调用VC写的DLL,是读写注册表的,我先在第一个JSP页面里用代码如下:
Registry register = null;
register = new Registry():
.
.
.
register.setValue("FirstName","song");.
.
.然后在第二个而面里读出上面的值。
Registry register = null;
register = new Registry():。


String firstName = null;
firstName = register.getValue("FirstName");.
.
.
这时就出现java.lang.UnstatifiedLinkError:Native:c:\WINNT\System 32\Registry.dll already loaded in another class loader.
我将第一步的register保存在Session里面也无济于是,
请各位大虾帮助了。

解决方案 »

  1.   

    你是不是把dll在两个类里面加载了两次
    这个可能不行吧你最好避免这种情况
      

  2.   

    Registry.dll already loaded in another class loader
    已经被另外一个加载了.
      

  3.   

    public class Registry
    {
        {
    try
    {
    System.loadLibrary("MseReg");
    }
    catch(SecurityException e)
    {
    e.printStackTrace();
    }
    catch(UnsatisfiedLinkError e)
    {
    e.printStackTrace();
    }
    }

             。
             。
    }
    是加载了两次,想unload DLL,也不知道如何做?
    请大虾指点啊。
      

  4.   

    没有unload方法你避免加载两次就行了最简单的办法就是用一个专门的类里面加载他]
    要使用这个dll里面的办法就直接调用那个类就ok了啊
      

  5.   

    把你的registry类改成
    public class Registry
    {
        {
               static{
    try
    {
    System.loadLibrary("MseReg");
    }
    catch(SecurityException e)
    {
    e.printStackTrace();
    }
    catch(UnsatisfiedLinkError e)
    {
    e.printStackTrace();
    }
            }
    }

             。
             。
    }
    将加载dll文件的代码放在static块中!
      

  6.   

    哦,不好意思,COPY的时候把static 掉了,我的类就是如楼上zhutouzip 所示。
      

  7.   

    我现在在不同的JSP页面里要调用这个类,每次在一个不同的页面调用的时候就出这样Excpetion,不知道如何是好。请各位大虾出些详细的点子才好啊。
      

  8.   

    不可能啊,我没遇到这种状况,你最好将这个dll文件放到System32目录或者classpath下,不要同时放入两个目录下!
      

  9.   

    我上面也说了啊!
    使用一个类来加载,并且放在static块里面
    那么你要使用这个dll就调用这个类对象就行了
      

  10.   

    如果你的是一个Web应用,可能出现由于 Web模块动态更新了,结果造成不断的圆形这个Registry类的问题
      

  11.   

    用一个类来加载,放在static方法里面。
    再用一类来重写本地方法!再用其它类来调用前者的方法。OK!
      

  12.   

    请问 jFresH_MaN(听说距离产生美,所以我将离开你!) 大哥及 bevin1010(醒客之路):
       能否说详细些,能否讲一下如设计这两个及在什么情况下有那个Load Dll的类。谢谢。
      

  13.   

    比如现在你有用C写的来访问数据库操作方面类,你编译成了.dll。
    现在你要用java来访问这种方法!首先在java类里用static方法加载.dll文件。然后写一些本地方法,这些方法就是用C写方法,没有方法体。再写一个类具体操作的类,这些类与刚才写的类的方法相同,只是返回刚才写的那个类的方法。
    如:
    public class A{
    public native String getContractor( String s_privateid ) throws PR_APIException ;
    static {
    System.loadLibrary( "XXX_Jni" ) ;
    }
    }
    public class B {
    public native String getContractor( String s_privateid )
    throws PR_APIException {
    return A.getContractor( String s_privateid );
    }
    }
      

  14.   

    哦,上面方法写错了!
    public class B {
    public String getContractor( String s_privateid )
    throws PR_APIException {
    return A.getContractor( String s_privateid );
    }
    }
      

  15.   

    To bevin1010(醒客之路) 大哥:我把你的类改下如下,用后仍然出现问题。
    public class B {
    A a = new A():
    public String getContractor( String s_privateid )
    throws PR_APIException {
    return a.getContractor( String s_privateid );
    }
    }
    分另在一JSP页面和Servlet里调用(用如下代码)
    B b = new B()
    b.getContractor(string);
    但还是出现同样的问题。
    请继续帮助,不胜感激。
      

  16.   

    晕,再来!你new了一个对象肯定不行,因为这样他又会加载那个library。
    public class B {
    private A a ;
    public String getContractor( String s_privateid )
    throws PR_APIException {
    return a.getContractor( String s_privateid );
    }
    }