项目比较紧张,不能谈论细节,只是做一个记录,关于生成dll文件可以看这篇:查看(有问题可以私我)
最近项目用了dll动态库和so库,分别是在Windows上调用dll和linux上调用so库的问题。使用了jna就需要对dll文件或者so文件进行加载,就衍生出了JNA对资源的路径加载问题,如果在idea中(Windows调用dll),可以通过run > editConfigrations > VM options 进行设置 -Djna.library.path=dll文件路径 ,值为dll文件放置的路径,如下图;下面我们谈下项目打包成jar包后放置在路径中无法加载的问题(Linux中调用so文件);

在这里插入图片描述


项目必须运行在Linux系统上,所以需要对项目打成jar包,然后在项目里面调用so文件中的方法

解决方法:

  • 1、将so文件放到/usr/lib/目录下,如图

在这里插入图片描述

  • 2、更改对接口Library的实现类中Native.loadLibrary()的加载路径,更改为Linux中的实际路径,如下所示,之前我一直使用System.loadLibrary()方法加载,但是无法加载出来,改用加载路径的方法和so文件的路径即可调用成功

在这里插入图片描述


加一张直观的Linux上和Windows调用的区别

在这里插入图片描述


推荐一篇写的较好的关于jna路径问题的帖子,可以尝试一下查看


*************************************20191213更新********************************

已经很久没有处理动态库调用的问题,UnsatisfiedLinkError错误是非常非常常见的,最根本的原因就是无法加载so/dll文件,路径找不到。最近有网友看到我的帖子后帮他们解决问题想起来,在这里总结一下UnsatisfiedLinkError问题出现的情况(仅供参考):

  • 生成的dll/so文件是32位,运行代码的机器是64位,总结为动态库文件和机器的位数不一致
  • jdk位数与dll/so文件的位数不一致,统一为32位或者64位
  • 动态库文件不是在系统文件加载路径下。一般来说Windows是system32目录,linux是/usr/lib目录下。
  • 调用方式不对。建议使用JNA调用,一个专门用来java调取动态库的框架
  • 使用jna调用时的名字写错,window上不带dll后缀,linux上带so后缀
  • 最致命的一个原因:so文件有问题,这也是最近一个网友问我的。我把我能想到的为都试了但就是解决不了,后来把我的类和so发给他能正常调用。这种问题的话需要重写c文件,并遵守动态库文件调用规范
Logo

更多推荐