Java使用jna调用c开发的动态库dll文件

news2024/11/23 20:27:42

文章目录

  • 前言
  • 1.c开发动态库dll
    • 1.1 新建项目dllDemo
    • 1.2 选择C library 在选择shared
    • 1.3 项目的目录结构
    • 1.4 定义动态库函数
    • 1.5 导出动态库
  • 2.java中使用jna调用dll
    • 2.1 需要引入jna的依赖
    • 2.2 加载动态库dll
    • 2.3 测试程序
      • 2.3.1 测试代码:
      • 2.3.2 测试结果输出

前言

在日常的开发中,对接外部接口常常有很多的对接方式,wsdl,rest,以及第三方提供的动态库等,本次将讲解在java中如何调用c开发的动态库。

1.c开发动态库dll

开发工具Clion,创建动态链接库。

1.1 新建项目dllDemo

project

1.2 选择C library 在选择shared

要选择shared,static是静态的
dynamic

1.3 项目的目录结构

包含头文件.h,和主要的代码.c文件,cmakelist.txt构建的脚本
目录结构

1.4 定义动态库函数

头文件定义两个动态库方法,hello以及add方法。

#ifndef DLLDEMO_LIBRARY_H
#define DLLDEMO_LIBRARY_H

void hello(void);

int add(int a,int b);

#endif //DLLDEMO_LIBRARY_H

在.c中写方法的具体实现。

#include "library.h"

#include <stdio.h>

void hello(void) {
    printf("调用动态库hello方法成功!\n");
}
//定义一个加法的方法
int add(int a,int b){
   int result = a+b;
    printf("调用动态库add方法:%d + %d=%d",a,b,result);
    return result;
}

1.5 导出动态库

简单动态库不需要在构建脚本中加入过多的代码,直接build project即可生成dll。
dll
到此为止动态库开发已经完毕,接下来就是开发java来调用dll。

2.java中使用jna调用dll

2.1 需要引入jna的依赖

        <dependency>
            <groupId>com.sun</groupId>
            <artifactId>jna</artifactId>
            <version>5.10.0</version>
        </dependency>

2.2 加载动态库dll

jna提供了方法与c方法一一映射的方法,提供一个接口继承library即可。
代码如下:

public interface DllDemo extends Library {
    DllDemo instance = Native.load("libdlldemo.dll", DllDemo.class);
    void hello();
    int add(int a,int b);
}

这是jna 提供c与java数据类型的对应关系。
数据类型

2.3 测试程序

2.3.1 测试代码:

public class TestDllDemo {
    public static void main(String[] args) {
        DllDemo.instance.hello();
        int result = DllDemo.instance.add(2,4);
        System.out.println(result);
    }
}

调用错误

调用可以看到错误,Exception in thread "main" java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序。
此错误是因为jdk的版本位数和动态 库的不一致导致的,两种解决方法:

  • 修改生成的dll的版本位数
  • 使用和dll版本匹配的jdk即可。

此处我直接修改jdk版本的位数。

2.3.2 测试结果输出

调用成功
到此为止 ,动态库的调用就结束啦。喜欢或者对你有帮助点个关注不迷路!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/667575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

maven的依赖范围scope使用

测试依赖的范围 #1、依赖范围 标签的位置&#xff1a;dependencies/dependency/scope 标签的可选值&#xff1a;compile/test/provided/system/runtime/import #①compile 和 test 对比 main目录&#xff08;空间&#xff09;test目录&#xff08;空间&#xff09;开发过程…

linux重新安装Yapi

需要保留原来Yapi对应的数据&#xff0c;这样就不需要安装mongo。 1. 安装Yapi npm install -g yapi-cli —registry https://registry.npm.taobao.org yapi server2.平台部署配置 安装成功后&#xff0c;默认端口是9000&#xff0c;开发服务器9000端口&#xff0c;需要服务…

崩盘预警币圈项目:Fintoch(分投趣)为何模式能做千亿资金?

崩盘预警币圈项目&#xff1a;Fintoch&#xff08;分投趣&#xff09;为何模式能做千亿资金&#xff1f; 大家好&#xff0c;小编是微三云的胡佳东&#xff0c;一家软件开发公司的负责人 Fintoch&#xff08;分投趣&#xff09;为何模式崩盘前能够吸引如此巨额资金&#xff1f…

供应链 | 基于图神经网络和深度强化学习的柔性车间调度方法

编者按 本次解读的文章发表于IEEE TRANSACTIONS ON INDUSTRIAL INFORMATICS&#xff0c;原文摘要总结如下&#xff1a;本文考虑了众所周知的灵活作业车间调度问题&#xff0c;并通过提出一种新颖的深度强化学习&#xff08;DRL&#xff09;方法来端到端地学习高质量的优先级调度…

SpringBoot实现过滤器Filter的三种方式

# 实现Filter接口方式① 使用Filter接口方式② 使用Component注解方式③ Java Config 配置类 # 实现Filter接口 过滤器 Filter 由 Servlet 提供&#xff0c;基于函数回调实现链式对网络请求与响应的拦截与修改。由于基于 Servlet &#xff0c;其可以对web服务器管理的几乎所有…

重复消费和堆积

接受消息会重复这一现状&#xff0c;然后通过一些方法来消除重复消息对业务的影响 利用幂等性解决重复消息问题 幂等&#xff08;其任意多次执行所产生的影响均与一次执行的影响相同。&#xff09; 一个幂等的方法&#xff0c;使用同样的参数&#xff0c;对它进行多次调用和一…

flutter七牛云上传sdk插件qiniu_flutter_sdk使用

flutter七牛云上传sdk插件qiniu_flutter_sdk使用 最近在拆分代码&#xff0c;将上传组件设置成插件&#xff0c;下面记录下实现过程。 一、创建flutter_plugin上传插件 这里Android Studio使用创建plugin 填写一下信息 Project nameProject locationDescriptionProject typ…

单片机入门所需的基础数电和模电知识

要学习单片机并入门相关领域&#xff0c;推荐掌握以下数电和模电的基础知识&#xff1a; 数电知识&#xff1a; 布尔代数和逻辑门&#xff1a;了解布尔代数的基本概念和逻辑门的工作原理&#xff0c;包括与门、或门、非门、与非门、或非门、异或门等。 时序逻辑和时钟信号&a…

AIOps介绍

AIOps介绍 AIOps是指人工智能运维&#xff08;Artificial Intelligence for IT Operations&#xff09;的缩写。它是将人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术应用于IT运维领域的一种方法。 传统的IT运维通常需要人工监测和管理大量的系…

脑机接口科普0022——黑门02:伦理道德问题

本文禁止转载&#xff01;&#xff01;&#xff01;&#xff01; 脑机接口这个技术&#xff0c;是属于黑科技技术中的一种。 现在已经有很多专家&#xff0c;以及机构&#xff0c;提出脑机接口的存在的一些问题。法律是一块的问题&#xff0c;伦理道德是另一块的问题。 虽然…

苹果iPhone14卡死怎么办?解决办法分享!

正常使用的iPhone14虽然很少会出现卡死的情况&#xff0c;但iPhone就是一台微型电脑&#xff0c;像电脑一样“死机”也不是没可能。 有用户称在使用iPhone14时出现突然出现弹出的提示框无法点击取消&#xff0c;锁屏也解决不了死机的问题。同时又因为屏幕其他区域不能操作&…

MySQL免安装配置教程(win10)

一、下载安装包 1.1、下载zip包 打开官网地址下载zip安装包&#xff0c;这里下载的版本是5.7&#xff0c;可自行选择。 对应下载网址&#xff1a;https://downloads.mysql.com/archives/community/ 根据自己电脑进行选择对应安装包 若需要下载msi安装包&#xff08;图形化界…

Mysql漏洞处理之升级版本到5.7.42过程指导手册

一、背景 某次安全漏扫&#xff0c;发现MySQL大量漏洞&#xff0c;基于Mysql之用于内网&#xff0c;且版本确实有点旧&#xff0c;考虑升级&#xff0c;综合漏洞分析&#xff0c;只能升级到最新版5.7.42和8.0.33&#xff0c;现场环境&#xff1a;Mysql 5.7.28、5.7.20和mysql&…

高等职业学院校园IP网络广播应用-河北资源环境职业技术学院校园IP广播

职业院校大学校园IP网络广播在河北资源环境职业技术学院产教融合基地的应用 北京海特伟业科技任洪卓发布于2023年6月20日 一、高等职业院校校园IP网络广播系统-广播中心 河北资源环境职业技术学院产教融合基地-高等职业院校校园IP网络广播系统是基于TCP/IP协议校园局域网构建…

通过GPIO子系统编写LED驱动,应用程序控制LED灯亮灭

1、在内核设备树中添加设备信息&#xff1a; LED1的设备树编写需要参考内核的帮助文档&#xff1a; linux-5.10.61/Documentation/devicetree/bindings/gpio 在根节点内部添加led灯设备树节点 :~/linux-5.10.61/arch/arm/boot/dts $ vi stm32mp157a-fsmp1a.dts myled.c #in…

渗透测试思路总结

一、说明 《Metasploit 渗透测试魔鬼训练营》等书已经对渗透测试的步骤流程划分得比较合理透彻了&#xff0c;但感觉在多次通读该类书藉之后仍总感觉不得要领----要对一台给定的主机进行渗透还是不懂到底该如何着手。想来主要是存在以下两个问题。 第一个是在渗透操作系统时&…

Yolov8优化:引入Soft-NMS,提升密集遮挡场景检测精度

1.Soft-NMS介绍 论文地址:https://arxiv.org/pdf/1704.04503.pdf NMS需要优化的参数: IoU 的阈值是一个可优化的参数,一般范围为0~0.5,可以使用交叉验证来选择最优的参数。 R-CNN会从一张图片中找出n个可能是物体的矩形框,然后为每个矩形框为做类别分类概率: 就…

maven测试依赖的排除

1、概念 当 A 依赖 B&#xff0c;B 依赖 C 而且 C 可以传递到 A 的时候&#xff0c;A 不想要 C&#xff0c;需要在 A 里面把 C 排除掉。而往往这种情况都是为了避免 jar 包之间的冲突。 所以配置依赖的排除其实就是阻止某些 jar 包的传递。因为这样的 jar 包传递过来会和其他 …

parallelStream与CompletableFuture

1 了解parallelStream parallelStream怎么实现的并行处理呢&#xff1f; 其底层是Fork/Join并行计算框架的默认线程池&#xff0c;默认线程池的数量就是处理器的数量&#xff0c;可以使用系统属性&#xff1a;-Djava.util.concurrent.ForkJoinPool.common.parallelism{N} 调整…

【数据库】MySQL 高级(进阶) SQL 语句

文章目录 前提条件一、常用查询1. SELECT&#xff08;显示查询&#xff09;2. DISTINCT&#xff08;不重复查询&#xff09;3. WHERE&#xff08;有条件查询&#xff09;4. AND/OR&#xff08;且/或&#xff09;5. IN &#xff08;显示已知值的字段&#xff09;6. BETWEEN&…