IDEA用JNA调用C++编写的dll动态链接库完整流程

IDEA用JNA调用C++编写的dll动态链接库完整流程

这是自己在做完《基于AES加密的动态链接库设计与应用》的系统实训后一些个人总结。自己比较菜,在调用这一块前前后后花了大概有三天时间,最后才成功实现。所以在这儿做些记录,如果你刚好遇到类似的问题,希望对你有所帮助。

生成DLL文件

我的系统实训使用C++写的动态链接库,用的软件是:Visual Studio 2017。
首先就是新建dll项目:
打开VS2017,文件->新建->项目->windows桌面->动态链接库
IDEA用JNA调用C++编写的dll动态链接库完整流程
直接新建,默认是会有以下这两个头文件和两个cpp文件的:
IDEA用JNA调用C++编写的dll动态链接库完整流程
我们不需要对这些文件进行操作,直接在头文件和源文件新建,并编写自己的程序文件就行。
下面是我的程序:
IDEA用JNA调用C++编写的dll动态链接库完整流程
我在Dll1.cpp里已经写好了完整的函数(不需要主函数),因为最后是要导出使用的,所以在对应的头文件Dll1.h里我要声明导出函数,具体代码格式参照上图。
如果程序调试完成,我们就可以直接生成解决方案。这里要注意生成解决方案的时候要选择release下,因为debug下可能在调用时会有些问题,具体原因我也不是很清楚,然后根据自己系统选择是x86还是x64即可。
IDEA用JNA调用C++编写的dll动态链接库完整流程
最后通过生成->生成解决方案,就能得到dll文件。
中途遇到一些问题基本百度都能解决。
IDEA用JNA调用C++编写的dll动态链接库完整流程
最后成功生成解决方案,这里的路径就是dll文件的路径,直接可以找到。
到这里,dll动态链接库就生成了。

JNA配置

接下来是配置JNA,我的IDEA是IntelliJ IDEA 2019.3.1 x64。而且我写的是一个web项目,所以使用的是IDEA的springboot框架。
项目建好后,在pom.xml里配置自己已经下载好的JNA。
IDEA用JNA调用C++编写的dll动态链接库完整流程
除此之外,还要在下面这里配置下载好的JNA。
通过file->project structure->modules->最右边的+号
IDEA用JNA调用C++编写的dll动态链接库完整流程
IDEA用JNA调用C++编写的dll动态链接库完整流程
到这儿IDEA里要配置的JNA都搞定了。
接下来就是导入函数。

函数导入

这里直接贴上我的导入动态链接库的代码。
IDEA用JNA调用C++编写的dll动态链接库完整流程
如果遇到找不到动态链接库的报错。
IDEA用JNA调用C++编写的dll动态链接库完整流程
基本就是两个原因:
1.路径不对
路径不对的话,我这是直接用的绝对路径,基本不会出错,就是对于一个系统来说不方便。还可以把dll放到项目下,路径直接写文件名(不要后缀)
2.生成dll文件位数不对
这就是前面生成dll的时候选择的x86还是x64的问题了,只要和自己系统匹配就行。

如果动态链接库导入成功但是报错找不到自己导出的函数。
原因大概也是两个:
1.导出函数在java声明这里的数据类型不匹配。因为dll是C++,你要用java调用,直接的数据类型匹配自然就是个问题。
详细知识可以直接百度或者参考这几个链接:
JNA和C/C++的数据类型转换
JNA 教程
这里讲一个我自己遇到的问题,我是因为开始在c++里写的函数返回值是string和输入参数类型const string&类型,然后就一直报错找不到导出的函数,后来发现是数据类型转换的问题,c++的string和java的string不是一个东西,和java的string对应的其实是c++的char类型。网上翻了好久也没找到合适的解决方法。最后是自己把原来的C++函数利用c++的string和char强制转换再封装一下,把函数返回值和输入参数都变成char*才解决。

2.在动态链接库里头文件声明导出函数格式不对。这个就要自己回头查看格式问题。

最后

完成上述步骤,基本就可以成功调用动态链接库里的方法了。