java使用jna调用c++的string参数类型函数时报错

前述:在测试时,java使用jna调用int add(int a,int b)方法时正常执行函数,java中能正常接收返回值类型,当调用string参数类型函数返回值也为string的函数时报错,实际上native方法是能够执行的。报错信息如下:大概意思是native的原生方法错误,实际就是项目中dll文件中声明的方法调用时报错,具体原因网友也是很多分析,有的说是跨内存释放时的错误,lz项目较为紧张再次仅做一个记录,有疑问可以提问

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff9e6bd1aa8, pid=3076, tid=0x00000000000032a8
#
# JRE version: Java(TM) SE Runtime Environment (8.0_201-b09) (build 1.8.0_201-b09)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.201-b09 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [WinEncryption.dll+0x1aa8]  encryption+0xa18
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# D:\AppClass\owntest\hs_err_pid3076.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.

解决方法:
很简单,在声明的函数参数string后加一个 & 即可:

  • 另还有一点,如果dll中导出的方法为a方法,但是a方法中调用带有string参数的b方法,若将b方法也加上改符号,同样调用失败,lz的做法是将b方法的实现直接放入到a方法中

在这里插入图片描述
执行后的结果:
在这里插入图片描述
可以看到的是:虽然能够正常执行了,但是返回值的string乱码,具体解决待更
后来我在jna api官网上看到确实c++/c在导出函数时确实需要以我上面的标准

----------------------------20190827--------------------------------

偶然之间看到之前这篇帖子想到这个乱码的解决问题:
后来我跟一个学c的朋友谈论到这个问题,他告诉我可能是c中的string类型都是以“\0”结尾,正好我解密后的字符串都是在末尾乱码,前面是正常的,我所以我个人认为这个还是很有可能的。但我查阅资料,发现对于这个说法网友说法不一致,在这里仅供参考,大家可以去网上查查,欢迎分享。后来对于这个问题我是这样解决的:使用c语言重新封装了一次函数,并且不使用string作为参数和返回值,用 char* 代替,并且取消返回值,将返回值作为第二个参数,java中调用时声明一个byte[1024]的空数组作为参数,方法调用完成后将该数组转化为Java中的String即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一米阳光zw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值