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:
# bugreport.java/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
解决⽅法:
很简单,在声明的函数参数string后加⼀个 & 即可:c++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即可
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论