刚学JNA,主要看了出现了一下破问题,不懂啊,那位大侠教教我怎么根据这个错误来跳程序啊
run:
#
# An unexpected error has been detected by Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x03097ac7, pid=2224, tid=2640
#
# Java VM: Java HotSpot(TM) Client VM (11.2-b01 mixed mode, sharing windows-x86)
# Problematic frame:
# C  [client.dll+0x27ac7]
#
# An error report file with more information is saved as:
# D:\NetBean\JNATest1\hs_err_pid2224.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
Java Result: 1
还有就是这个错误开始没有的,同一个程序跑了第5遍的时候才这样的帮帮忙,谢谢啦

解决方案 »

  1.   

    Runtime error,EXCEPTION_ACCESS_VIOLATION,内存访问出错。你给的信息看不太出来问题。 我咕计和你出的clib有关,可能有bug.
      

  2.   

    这是比较详细的内容原工程文件中delphi对用C++写的dll的函数声明注册函数
       { DUABind是DUA向DSA注册函数,该函数完成向给定的DSA注册的功能。
    入口参数:puserinfo 指向结构TUserInfo 的指针,调用前把结构中的成员赋值;
      dsaip_address DSA所在的服务器的IP地址;
      port_no 证书服务进程公布的端口号;
      bindseconds 注册所需的最大秒数。
    出口参数:psock  指向SOCKET类型的变量地址,若注册成功后,则本函数负责填写;
    返回值:0 表示注册成功,1 表示用户身份非法,2  打请求包错误,
    3 网络连接失败,4 打上三层数据包错误,
    5 注册信息发送失败,6 注册信息接收失败或超时
    7 解上三层数据包错误,8 解注册结果包错误,
    9 收到的信息不认识  }
    function   DUABind(puserinfo     : PUserInfo;
                       dsaip_address : pchar;
                       port_no       : integer;
                       var psock     : TSocket;
                       bindseconds   : integer
                       ):integer;cdecl;external CLIENT_DLLNAME name 'DUABind';
    其中的数据结构如下:
      TUserInfo =record
        Name        :array[0..MAX_RDN_LENGTH-1] of char; //注册用户的RDN名字
        Password    :array[0..MAX_PASSWORD_LENGTH-1] of char; //未保护的口令
      end;
      PUserInfo=^TUserinfo;
    下面是我写的
    1、
    对数据结构的声明
    public class TUserInfo extends Structure{
        public String Name = null;      
        public String Password = null;  
    }
    对dll中函数的声明
    public interface SimpleDUA extends StdCallLibrary {
      
        SimpleDUA INSTANCE = (SimpleDUA)Native.loadLibrary("client", SimpleDUA.class);
        int DUABind(TUserInfo puserinfo,
                String dsaip_address,
                int port_no,
                Socket psock,
                int bindseconds);
    ......
    }2、java中对接口simpleDUA方法的使用:public class JNADUA {
    public SimpleDUA getDUAInstance(){
            SimpleDUA lib = SimpleDUA.INSTANCE;
            return lib;
        }public int DUABind(simpleDUA lib,
                TUserInfo puserinfo,
                String dsaip_address,
                int port_no,
                Socket psock,
                int bindseconds){
            int duabind = lib.DUABind(puserinfo, dsaip_address, port_no, psock, bindseconds);
            return duabind;
        }
    }3、对数据结构的初始化public class Structinitial {    public TUserInfo initUserInfo(){
            TUserInfo UserInfo = new TUserInfo();
            UserInfo.Name = "administrator";
            UserInfo.Password = "12345";
            return  UserInfo;
        }
        
    }
    4、main函数调用public class Main  implements invariable{    /**
         * @param args the command line arguments
         */
    public static void main(String[] args){
            JNADUA jnaDUA = new JNADUA();
            simpleDUA lib = jnaDUA.getDUAInstance();        Structinitial init = new Structinitial();
            TUserInfo UserInfo = init.initUserInfo();        Socket sock = null;
           
            int testbind = jnaDUA.DUABind(lib, UserInfo, dsaip_address, port_no, sock, MAXTIMEOUT);
            System.out.print(testbind);    
        }
    }
    出现的错误就是最开始的那样了。
    哪个地方有问题?谢谢啦
      

  3.   

    你上面使用JNA对Client.dll库的调用没什么问题。有一点我不确定,Socket sock = null; sock没有被初始化就被传进了DUABind方法,没看到了具体的实现过程,就不清楚client.dll是如何使用sock指针的了。有可能就要求传一个空指针进去,请确认一下。其次,使用JNA要注意的地方是你在java里使用的数据类型和要库中使用的数据类型长度一至,比如java中int是32位的,而有些库里int是16位的,这时java里要用short.要特别注意。也请再检查一下。最后,实际的问题是还出在了client.dll里面,而不是上面给你出的地方。这种情况,可能出问题的地方就太多了,比如dll库和系统不兼容等。。那就我就无能为力了。我的一点建议,试试看吧。
      

  4.   

    谢谢这位大哥,client.dll应该没问题的,在同样的系统环境下用delphi调用过。Socket sock是运行完DUABind之后,函数覆值的,用new会报错,我也认为是数据类型的问题,就是不知道该怎么改,上面的pchar不知道能不能用string.不知道大哥有没有可参考的资料?非常感谢您的回答