问题补充: 源程序: SkyJavaAPI { ... public native DEVICEINFO GetDeviceInfo(int sessionhandle) ... }class DEVICEINFO{ public int Device_ID; ... } test程序: DEVICEINFO deviceinfo =new DEVICEINFO(); deviceinfo=javaapi.GetDeviceInfo(sessionhandle); 但是每次执行到第二句话就出错,是不是源程序里面参数返回不能是DEVICEINFO?
public native DEVICEINFO GetDeviceInfo(int sessionhandle)这个方法体是什么。具体点
代码大致就是这样,不知道你们能不能理解,还是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 获取随机数成功! 获取设备信息成功本来应该后面还有很多程序的,但是不继续执行了!这里是获取设备出问题了,但是同时有说获取信息成功!
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; }
你java 是用什么机制调c的方法的。最大可能就是类型转换的错。
在DEBUG模式,执行到deviceinfo=javaapi.GetDeviceInfo(sessionhandle);的时候,会跳转到 protected Class<?> findClass(final String name) throws ClassNotFoundException{}这个里面去,throw new ClassNotFoundException(name);
源程序:
SkyJavaAPI {
...
public native DEVICEINFO GetDeviceInfo(int sessionhandle)
...
}class DEVICEINFO{
public int Device_ID;
...
}
test程序:
DEVICEINFO deviceinfo =new DEVICEINFO();
deviceinfo=javaapi.GetDeviceInfo(sessionhandle);
但是每次执行到第二句话就出错,是不是源程序里面参数返回不能是DEVICEINFO?
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
获取随机数成功!
获取设备信息成功本来应该后面还有很多程序的,但是不继续执行了!这里是获取设备出问题了,但是同时有说获取信息成功!
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;
}
protected Class<?> findClass(final String name)
throws ClassNotFoundException{}这个里面去,throw new ClassNotFoundException(name);
这种情况,你可以把jni接口改一下,用数组的方式调用,然后在java端把相关的Device_ID等信息自己手动的设置到DEVICEINFO对象中