JNA调用pb编写的dll ref string无法返回值,在线求助大神

孤城落日 2019-04-18 10:50:16
大家好,最近做接口遇到了这个问题,DLL是用PB写的,我调用里面的函数。定义如下:
-------------------------------------------------------------------------------------------------------
函数定义:
function boolean getErrMsg(long whandler,ref string value) library "sieaf.dll"
-------------------------------------------------------------------------------------------------------
在Java中的接口转化是通过JNA实现的:
public interface Sieaf extends Library {

// 加载库文件
Sieaf instanceDll = (Sieaf)Native.loadLibrary("Sieaf", Sieaf.class);

// 函数模拟
boolean getErrMsg(long whandler, byte[] value);
}
-------------------------------------------------------------------------------------------------------
其中的value即为返回消息字符串,但在JNA映射中不论我使用String还是byte[],都无法获得正常返回值(皆为空)。
...全文
350 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
NANU-NANA 2019-10-08
  • 打赏
  • 举报
回复
既然问题解决了,请及时结帖。
孤城落日 2019-10-08
  • 打赏
  • 举报
回复
引用 10 楼 陌路爵士1775 的回复:
您好,解决了么,是用什么进行接收的

接口初始化的init返回的参数类型定义错了,不是long,改成int就好了
陌路爵士1775 2019-09-07
  • 打赏
  • 举报
回复
您好,解决了么,是用什么进行接收的
十八道胡同 2019-04-18
  • 打赏
  • 举报
回复
不知道是不是编码问题,你参考下 https://blog.csdn.net/TroyLemon/article/details/46804127
孤城落日 2019-04-18
  • 打赏
  • 举报
回复
引用 7 楼 LCL_data 的回复:
1)sieaf.dll有日志没? 看下你传入的whandler,他正常接收没?
2)getErrMsg 看名字是返回错误信息,那么你的示例代码,他会有错误的吧?

1) dll没有产生日志,whandler是接口中init方法返回的参数,init接口返回值是long,可以正常接收。
2) 示例代码的业务是先进行签到,返回了false,再调用getErrMsg 获取错误信息的。
十八道胡同 2019-04-18
  • 打赏
  • 举报
回复
1)sieaf.dll有日志没? 看下你传入的whandler,他正常接收没?
2)getErrMsg 看名字是返回错误信息,那么你的示例代码,他会有错误的吧?
孤城落日 2019-04-18
  • 打赏
  • 举报
回复
引用 5 楼 LCL_data 的回复:
[quote=引用 3 楼 孤城落日 的回复:]
        YlybDll.instance.putPara(whandler, "usr", "yyyylyl02");
YlybDll.instance.putPara(whandler, "pwd", "888888");
YlybDll.instance.putPara(whandler, "xtdh00", "YD");
//执行登陆操作
boolean lb_success = YlybDll.instance.process(whandler, "F00.00.00.00");
System.out.println("签到状态:"+lb_success);
Pointer ptr = new Memory(300);
boolean ret = YlybDll.instance.getErrMsg(whandler, ptr);
System.out.println(ret + " " + ptr.getString(0));


控制台最后打印出来的是:true ?


System.out.println(ret + " " + ptr.getString(0));
你需要确认下,这个打印出来的值 是不是 函数正确调用后的 应该的返回值[/quote]

不是的,现在返回的是?,开始用byte[]返回的是空,正确应该返回一些网络连接失败,账号密码不匹配之类的信息
十八道胡同 2019-04-18
  • 打赏
  • 举报
回复
引用 3 楼 孤城落日 的回复:
        YlybDll.instance.putPara(whandler, "usr", "yyyylyl02");
YlybDll.instance.putPara(whandler, "pwd", "888888");
YlybDll.instance.putPara(whandler, "xtdh00", "YD");
//执行登陆操作
boolean lb_success = YlybDll.instance.process(whandler, "F00.00.00.00");
System.out.println("签到状态:"+lb_success);
Pointer ptr = new Memory(300);
boolean ret = YlybDll.instance.getErrMsg(whandler, ptr);
System.out.println(ret + " " + ptr.getString(0));


控制台最后打印出来的是:true ?


System.out.println(ret + " " + ptr.getString(0));
你需要确认下,这个打印出来的值 是不是 函数正确调用后的 应该的返回值
十八道胡同 2019-04-18
  • 打赏
  • 举报
回复
 ptr.getString(0)


这个就是你的函数的返回值
孤城落日 2019-04-18
  • 打赏
  • 举报
回复
        YlybDll.instance.putPara(whandler, "usr", "yyyylyl02");
YlybDll.instance.putPara(whandler, "pwd", "888888");
YlybDll.instance.putPara(whandler, "xtdh00", "YD");
//执行登陆操作
boolean lb_success = YlybDll.instance.process(whandler, "F00.00.00.00");
System.out.println("签到状态:"+lb_success);
Pointer ptr = new Memory(300);
boolean ret = YlybDll.instance.getErrMsg(whandler, ptr);
System.out.println(ret + " " + ptr.getString(0));


控制台最后打印出来的是:true ?
十八道胡同 2019-04-18
  • 打赏
  • 举报
回复

interface DllService extends Library {
DllService INSTANCE = (DllService) Native.loadLibrary("CalLinux", DllService.class);
boolean Cal(String paramString, Pointer resultString);
}


Cal里面paramString 是传入的参数,resultString是传出的参数。

我们的调用方式:
 
Pointer pointer = new Memory(300);
boolean ret = dllService.Cal("1234567890,", pointer);
System.out.println(ret + " " + pointer.getString(0));

十八道胡同 2019-04-18
  • 打赏
  • 举报
回复
  
Pointer pointer = new Memory(300);
//这里调用,传入pointer
//这里使用pointer.getString(0)来接受返回值


我们用pointer用来接受C++里面的 char*的传出值的,你试试
也是用的JNA

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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