jna 调用dll 参数上的返回值怎么获取

HeroesIT 2020-09-29 02:13:52
用java后台调用博思财政软件的dll 库

这是dll文档对应函数的说明
3.4、转入开票数据
说明:根据博思票据预设的需求格式,转入博思开票界面,并可进行打印票据信息。
Function PZrPj
(ZrTxt:PChar;IsPrn:integer; PjLx,Bz,Res:PChar):integer;StdCall;
参数: ZrTxt : 票据数据
(格式详见:数据格式说明.txt 文件)
IsPrn : 0 表示显示转入票据信息后再进行开票
1 表示直接开票并打印
2 表示直接开票但不打印
PjLx : 票据类型
(传空表示取默认当前的票据类型开票,
不为空则指定类型)
Bz : 单据的备注 (可选的参数,可不传则转入无备注)
Res: 只作为存储返回字符
成功:票据类型号,票据号,金额,注册号(以,分格)
错误:(错误信息)
返回值: 参数Res的长度

示例1:var vRes:pChar;
SetLength(vRes,500);
//vRes变量宽度,请定义足够大以返回完整错误信息
PZrPj(SomeString,1,’001001’,’’,vRes)
返回值:25
vRes返回值:’成功:001001,085256,1200.3,闽财2004票’
表示:传入开票内容为SomeString,票据类型为’001001’,
备注为空
返回值:长度为25
开票成功,返回值为 票据类型为001001
票据号为085256
金额为1200.3元
注册号 闽财2004票
示例2:var vRes:pChar;
PZrPj(SomeString,1,’’,’张三’,vRes)
返回值: 31 vRes返回值:’错误:请先上报核销后才能开票据。’
表示: 传入开票内容为SomeString,票据类型为默认值,
备注为’张三’
返回值长度为31
开票不成功,返回值为不成功的错误信息


我在java上是获取不到res返回的值
以下是我实现的步骤
dll 接口
package com.synjones.bosi;

import com.sun.jna.Library;
import com.sun.jna.Native;

public interface BosiAPI extends Library{
BosiAPI insanceDll = Native.loadLibrary("KpJk.dll", BosiAPI.class);
int PConnect();//连接博思开票系统(方式一)
int PLoginSuccess();//判断是否登陆成功
int PZrPj(String ZrTxt,int IsPrn,String PjLx,String Bz,String Res);//转入开票数据

}


测试代码
package com.synjones.bosi;

import com.sun.jna.ptr.PointerByReference;
public class bositest {

public static void main(String[] args) {
// TODO Auto-generated method stub
int j = BosiAPI.insanceDll.PConnect();
System.out.println(j);
int i = BosiAPI.insanceDll.PLoginSuccess();
System.out.println(i);
kptest();
}


public static void kptest() {
System.out.println("开票测试");
String ZrTxt = "<&票据><&票据头>姓名=赵惠卿\t就诊号=12314\t保险编号=\t性别=女\t就诊科室=\t人员类别= \t医保类别=省医保\t付款方式=现金\t缴费流水号=2\t医保收据号=\t医疗费用总额= \t公务员补助支付=\t统筹金支付= \t个人现金支付= \t个人帐户支付= 大额补助支付= 上次账户余额= 个人账户余额=</&票据头><&收费项目>收费项目=R01 计费数量=3 收费标准=100 金额=300</&收费项目></&票据>";
PointerByReference pref = new PointerByReference();
String res = "";
int i = BosiAPI.insanceDll.PZrPj(ZrTxt, 1, "14004003", "这是备注", res);
System.out.println(i);
// Pointer p = pref.getValue();
// System.out.println(p);
// byte [] buffer = p.getByteArray(0,i);
// System.out.println(buffer);
System.out.println(res);
System.out.println("-------------------");
}

}

代码执行后博思软件那边可以正常接收数据 java这边获取不到res的值
博思的日志已经显示成功

有碰到相同问题帮下忙 感谢

...全文
886 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ξ衔☆泪】 2021-03-27
  • 打赏
  • 举报
回复
java这里,出参字节数组需要预先分配空间么?
HeroesIT 2020-12-10
  • 打赏
  • 举报
回复
引用 3 楼 weixin_41801581的回复:
大佬,你是怎么解决的
用字节数组接收的
weixin_41801581 2020-12-10
  • 打赏
  • 举报
回复
大佬,你是怎么解决的
HeroesIT 2020-09-29
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
String不能传入传出,所以应该用char[]数组
感谢大佬 可以接收到值了 去解决新问题了 返回的是乱码
routineMonkey 2021-09-28
  • 举报
回复
@HeroesIT 乱码问题解决了嘛
HeroesIT 2021-09-30
  • 举报
回复
@routineMonkey System.setProperty("jna.encoding","GBK");
qybao 2020-09-29
  • 打赏
  • 举报
回复
String不能传入传出,所以应该用char[]数组

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧