前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java 调用 dll动态库

java 调用 dll动态库

作者头像
用户10125653
发布2022-11-10 21:52:37
4.2K0
发布2022-11-10 21:52:37
举报
文章被收录于专栏:changechange

检查dll动态库

通过软件 DependenciesGui.exe 检查CloseLoopCalDll.dll动态库

  • 动态库缺少依赖

注意点:缺陷dll核心依赖,加载的时候会报错缺少依赖,如果是Windows系统依赖缺失并且dll算法并没有调用此依赖时,是可以加载成功的

  • 动态库打包错误
a6e11f8770841085082ad00c0eca430.png
a6e11f8770841085082ad00c0eca430.png

注意点:dll虽然可以成功加载,但是由于动态库的打包错误,相应的方法是找不到。

  • 正确的动态库
image.png
image.png

java程序加载dll动态库

  • 导入依赖
代码语言:javascript
复制
//jna
implementation group: 'net.java.dev.jna', name: 'jna'
  • 按路径加载
代码语言:javascript
复制
  private static void loadFile(String ext,File file){
        if (ext.equals(".so") || ext.equals(".dll")) {
            try {
                System.load(file.getPath());
                log.info("加载native文件[{}]成功!!", file);
            } catch (UnsatisfiedLinkError e) {
                log.error("加载native文件[{}]失败!!请确认操作系统是否能解析文件", file);
            }
        }
    }
  • 按文件名加载
代码语言:javascript
复制
 private static void loadFile(String ext,File file){
        if (ext.equals(".so") || ext.equals(".dll")) {
            try {
                System.loadLibrary(file.getName());
                log.info("加载native文件[{}]成功!!", file);
            } catch (UnsatisfiedLinkError e) {
                log.error("加载native文件[{}]失败!!请确认操作系统是否能解析文件", file);
            }
        }
    }

注意点:加载dll动态库可以自己创建类和方法去实现

调用dll动态库

  • 创建接口类
代码语言:javascript
复制
public interface CloseLoopCal extends Library {}

注意点:接口类需要继承 Library 类

  • 编写java 抽象方法
代码语言:javascript
复制
boolean SafeAnalysis(double[] result,byte[] data,int count,double[] parameter,  String filePath);
  • 与其对应的c++方法
代码语言:javascript
复制
bool SafeAnalysis(double *result, char *data, int count, double *parameter, char *fname);
  • 基本数据类型映射关系
  • 调用dll动态库
代码语言:javascript
复制
//很关键 设置字符集,字符集不匹配无法调用dll
System.setProperty("jna.encoding", "GB2312");
Native.setProtected(true);
CloseLoopCal closeLoopCal = Native.loadLibrary("CloseLoopCalDll", CloseLoopCal.class);
closeLoopCal.SafeAnalysis(new double[10],new byte[10],5,new double[10],"");

注意点:字符集的类型和调用dll字符集类型必须保持一致

生产环境运行

代码语言:javascript
复制
生产环境下和测试环境下略有不同,测试环境下我们只需要把dll放到项目根目录即可加载dll,生产环境运行的是jar包,dll可能没有一起打包,会导致找不到dll的问题,网上解决办法比较多,自行解决。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 检查dll动态库
  • java程序加载dll动态库
  • 调用dll动态库
  • 生产环境运行
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档