JNA调用Dll的问题
发布时间:2020-09-21 16:37:10 所属栏目:Windows 来源:互联网
导读:将DLL和DLL对应的配置文件置于JDK的bin目录中,需要注意的是64位的JDK只能使用64位的dll 可以使用 file命令检测dll是否是64位 配置 public interface YilianInterface extends Library{ public int SIT_CRT_GetStatus(); public int SIT_CRT_Reset(int
将DLL和DLL对应的配置文件置于JDK的bin目录中,需要注意的是64位的JDK只能使用64位的dll 可以使用 file命令检测dll是否是64位 配置public interface YilianInterface extends Library{ public int SIT_CRT_GetStatus(); public int SIT_CRT_Reset(int nMode); public int SIT_EPP_UseEppPlainTextMode(); public int SIT_Trans_init(); } 调用的类中使用声明这个 private static YilianInterface HDICCard_INSTANCE; static{ HDICCard_INSTANCE =(YilianInterface)Native.loadLibrary("XZ_POS_Pay",YilianInterface.class); } 调用普通调用int b = HDICCard_INSTANCE.SIT_CRT_GetStatus(); 有回调值的调用//使用带有返回值的参数的需要使用Pointer,并预先分配内存 Pointer p = new Memory(256); int b = HDICCard_INSTANCE.XZ_POS_Trans(1,null,"0.10",p); C/C++中与Char * 对应的类型应该为String,而不是byte[],而返回值需要预先分配内存 可能出现的问题测试Dll中方法的时候tomcat直接挂掉,可能会有以下两种原因 Dll就存在内存泄漏,这个需要dll提供方将内存泄漏的位置进行修改Java提供的内存分配不合理,需要手动分配内存(这个主要是针对具有返回值的方法而言) 代码如下Pointer p = new Memory(256); int b = HDICCard_INSTANCE.XZ_POS_Trans(1,null,p); //byte[] byteArray = p.getByteArray(0,256); HashMap<String,Object> map = new HashMap<String,Object>(); if(b==0){ map.put("status",0); map.put("msg","消费成功"); }else{ map.put("status",-1); map.put("msg","消费失败"); } long peer = Pointer.nativeValue(p); Native.free(peer);//手动释放内存 Pointer.nativeValue(p,0); (编辑:鄂州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- 强制Xamarin在Windows上使用Mono
- 批处理文件 – Windows批处理将记录添加到主机文
- windows下编译mxnet并使用C++训练模型
- 如何在Qt中设置按钮的背景颜色后保留Windows Aer
- windows平台xFsRedir程序更新(虚拟磁盘镜像存储
- windows – 如何通过apt-cyg安装cygwin / X
- .net – Windows Azure Web角色缓存(预览)“挂起
- .net – System.Diagnostics.EventLog – 连接到
- 如何将windows自带的简化版OneNote卸载?
- xaml – Windows 8 App,更改BackButtonStyle的颜
热点阅读