本帖最后由 yudean1989 于 2011-07-20 10:09:55 编辑

解决方案 »

  1.   

    问题补充:
    源程序:
    SkyJavaAPI {
    ...
    public native DEVICEINFO GetDeviceInfo(int sessionhandle)
    ...
    }class DEVICEINFO{
    public int Device_ID;
    ...
    }
    test程序:
    DEVICEINFO deviceinfo =new DEVICEINFO();
    deviceinfo=javaapi.GetDeviceInfo(sessionhandle);
    但是每次执行到第二句话就出错,是不是源程序里面参数返回不能是DEVICEINFO?
      

  2.   

    public native DEVICEINFO GetDeviceInfo(int sessionhandle)这个方法体是什么。具体点
      

  3.   

    代码大致就是这样,不知道你们能不能理解,还是JNI调用DLL的,报出的错误很奇怪,给你们看下执行后的结果:
    int类型设备句柄值:3704
    int类型会话句柄值:4
    --------------设备管理类函数测试BEGIN--------------
    44,-78,34,-123,-107,-45,-51,-29,64,62,-118,9,63,14,-126,-90,
    -------------我是分割线-------------
    #
    # An unexpected error has been detected by Java Runtime Environment:
    #
    #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d98af30, pid=2944, tid=5272
    #
    # Java VM: Java HotSpot(TM) Client VM (11.3-b02 mixed mode windows-x86)
    # Problematic frame:
    # V  [jvm.dll+0xdaf30]
    #
    # An error report file with more information is saved as:
    # F:\yudean\SecondCard\hs_err_pid2944.log
    #
    # If you would like to submit a bug report, please visit:
    #   http://java.sun.com/webapps/bugreport/crash.jsp
    #
    打开设备成功
    创建会话成功
    获取私钥使用权限成功!私钥索引:2
    获取随机数成功!
    获取设备信息成功本来应该后面还有很多程序的,但是不继续执行了!这里是获取设备出问题了,但是同时有说获取信息成功!
      

  4.   


    void GeDeviceInfo(HANDLE hSessionHandle)
    {
    INT iRet;
    DEVICEINFO DevInfo; CLEAR_CONSOLE();
    printf("\n\n -----------------------  Get Device info -----------------------\n\n");
    iRet=SDF_GetDeviceInfo(hSessionHandle,&DevInfo);
    if(iRet!=SR_SUCCESSFULLY){
    ErroPrint("SDF_GetDeviceInfo",iRet);
    GoOut();
    return;
    }
    printf("\n\n Issuer Name          : %40s",DevInfo.IssuerName);         //厂商信息
    printf("\n\n Device ID            : %16s",DevInfo.DeviceName);         //设备型号 
    printf("\n\n Device Serial        : %16s",DevInfo.DeviceSerial);       //设备编号
    printf("\n\n Device Version       : 0x%08x",DevInfo.DeviceVersion);    //内部软件版本号
    printf("\n\n Standard Version     : 0x%08x",DevInfo.StandardVersion);  //接口规范版本号
    printf("\n\n AsymAlg Ability      : 0x%08x",DevInfo.AsymAlgAbility[0]);//支持的非对称算算法
    printf("\n\n SymAlg Ability       : 0x%08x",DevInfo.SymAlgAbility);    //支持的对称算算法
    printf("\n\n Hash Alg Ability     : 0x%08x",DevInfo.HashAlgAbility);   //支持的杂凑算法
    printf("\n\n Buffer Size          : %08d",DevInfo.BufferSize);        //最大文件存储空间 GoOut();
    return;
    }
      

  5.   

    你java 是用什么机制调c的方法的。最大可能就是类型转换的错。
      

  6.   

    在DEBUG模式,执行到deviceinfo=javaapi.GetDeviceInfo(sessionhandle);的时候,会跳转到
    protected Class<?> findClass(final String name)
     throws ClassNotFoundException{}这个里面去,throw new ClassNotFoundException(name);
      

  7.   

    C里的DEVICEINFO是个结构体,和java里的类的对象实例(内存结构)不匹配,不能直接返回
    这种情况,你可以把jni接口改一下,用数组的方式调用,然后在java端把相关的Device_ID等信息自己手动的设置到DEVICEINFO对象中
      

  8.   

    我现在直接把这个GetDeviceInfo这个方法写到java里面,不调用dll了,问题解决了!