Java JNA 调用DLL(动态连接库) 回调函数

news2025/1/12 3:56:57

首先准备好动态链接库dll

        参考连接

visual studio 2017 创建dll文件并使用https://blog.csdn.net/miss_na/article/details/113524280

Visual Studio 2017 动态链接库(.dll)生成与使用的简明教程https://blog.csdn.net/Hide_on_Stream/article/details/109172054

jni之jni与jna的比较https://www.cnblogs.com/bingblogs/p/13662069.html

typedef void(*F)(int)理解https://blog.csdn.net/weixin_44684139/article/details/104517714

我创建的文件如下 myObject.h

#pragma once  //规定只编译一次

//宏定义,增加可读性
#define DATAEXCHANGEDLL_API __declspec(dllexport)

//按C进行编译,声明.cpp中的函数 
// typedef void(*ccback)(char *name, int length);
// 定义了一个指向函数的指针F,其指向的函数的返回值为 void 类型,参数是后面的(int).
// 此函数是被定义为回调函数,在myObject.cpp里面是没有实现的;
typedef void(*ccback)(char *name, int length, BYTE cmd, void* responseData);

extern "C" DATAEXCHANGEDLL_API int dllFunction(char *ip, int port, void (*ccback)(char *name, int length, BYTE cmd, void* responseData));

extern "C" DATAEXCHANGEDLL_API bool  test_open(void* responseData);

myObject.cpp如下

#include "pch.h"    //必要的头文件
#include "myObject.h" //自己的头文件
#include <iostream>

ccback c;

int dllFunction(char *ip, int port, void(*ccback)(char *name, int length, BYTE cmd, void* responseData)) {
	printf("port is : %d\n", port);
	c = ccback;

	static int a = 5;
	int* pi = &a;

	BYTE b{ 42 };

	c(ip, port, b, pi);
	return 0;
}

bool test_open(void* responseData) {

	static int a = 5;
	int* pi = &a;
	responseData = pi;
	return 1;
}

Java环境准备

Maven 地址

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.7.0</version>
</dependency>


<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.10</version>
</dependency>

Java代码

package com.test.jnacallback;

import com.sun.jna.Callback;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.PointerByReference;
import com.sun.jna.win32.StdCallLibrary;

/**
 * @ClassName: DllCallBackTest
 * @Author:
 * @Date: 2022/12/09
 * @Description:
 *
 *
 *          JNA中回调的本质是一个指向native函数的指针,通过这个指针可以调用native函数中的方法
 *
 *
 */

public class DllCallBackTest {


    public interface JnaCallBackDll extends StdCallLibrary {

        public static JnaCallBackDll instance = Native.load("E:\\VS项目\\javaDllTest006_Callback\\x64\\Debug\\javaDllTest006_Callback.dll",JnaCallBackDll.class);

        int dllFunction(String host, int port, Callback callback);

        Boolean test_open(PointerByReference pointer);

        public interface SCBack extends Callback {
            public void MessageHandle(String name, int length,Byte cmd, String pointer);
        }

        public static class SCBack_Impl implements SCBack {


            private PointerByReference pointerTTT = new PointerByReference(Pointer.NULL);

            @Override
            public void MessageHandle(String ip, int port, Byte cmd, String pointer) {

                // TODO Auto-generated method stub

                System.out.println("回调成功!");
                System.out.println("ip :" + ip);
                System.out.println("port :" + port);
                System.out.println("pointer :" + pointer);
                System.out.println("cmd :" + cmd);

                // 此处添加需要的数据处理操作


            }

        }

    }

    public static void main(String[] args) {
       DllCallBackTest.JnaCallBackDll.SCBack callback = new JnaCallBackDll.SCBack_Impl();
       JnaCallBackDll.instance.dllFunction("127.0.0.1", 3306, callback);

    }


}

效果

回调成功!
ip :127.0.0.1
port :3306
pointer :
cmd :42
port is : 3306
Disconnected from the target VM, address: '127.0.0.1:51404', transport: 'socket'

Process finished with exit code 0

写在最后,如果回调函数返回的对象有类对象,像Student这种对象;需要在java中新建Student对象;

Java对应C++结构体对象

package com.test.jnacallback;

import com.sun.jna.Structure;

import java.util.Arrays;
import java.util.List;

/**
 * @ClassName: Student
 * @Author: 
 * @Date: 2022/12/16
 * @Description: TODO
 */

public class Student extends Structure {

    public byte[] id = new byte[64];

    public int age;

    public int name;


    @Override
    protected List<String> getFieldOrder() {
        return Arrays.asList(new String[]{"id","age","name"});
    }


    public byte[] getId() {
        return id;
    }

    public void setId(byte[] id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getName() {
        return name;
    }

    public void setName(int name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + Arrays.toString(id) +
                ", age=" + age +
                ", name=" + name +
                '}';
    }
}



然后,把回调函数中的 MessageHandle 参数直接替换成对象 Student student 就行;

折腾了两三天,终于能调用通了;希望对你有帮助;具体问题具体分析把,精力有限,先写这么多,有问题留言;

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

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

相关文章

【记录】U盘安装Ubuntu20.04系统

之前电脑安装的Centos7系统&#xff0c;但是在启动过程中遇到了文件异常&#xff0c;就开不了机了&#xff0c;另外貌似Centos7已经停止维护了&#xff0c;想了下&#xff0c;果断不要数据了&#xff0c;直接重装系统吧&#xff0c;这次选用的是Ubuntu 20.04【ps: 没有选择最新…

「含元量」激增,这届世界杯的看点不止足球

文|智能相对论 作者|青月 半决赛结束&#xff0c;卡塔尔世界杯已经正式进入倒计时阶段。 这届世界杯诞生了不少精彩瞬间&#xff0c;在小组赛中&#xff0c;日本、韩国、沙特接连打败西班牙、葡萄牙、阿根廷等传统强队&#xff0c;摩洛哥也代表非洲球队首次挺进四强&#xf…

v8垃圾回收

文章目录内存的生命周期v8垃圾回收算法新生代Scavenge图例老生代Mark-SweepMark-Compact图例v8垃圾回收的弊端v8垃圾回收优化内存的生命周期 内存的生命周期可以分为三个阶段&#xff1a; 内存分配&#xff1a;按需分配内存内存食用&#xff1a;读写已经分配的内存内存释放&a…

Linux 管理联网 配置网络的四种方法 配置临时连接( ip 命令)

配置网络 # 网络接口是指网络中的计算机或网络设备与其他设备实现通讯的进出口。这里,主要是 指计算机的网络接口即 网卡设备 # 网络接口 -- 网卡 的命名 &#xff1a; 从RHEL7开始引入了一种新的“一致网络设备命名”的方式为网络接口命名,该…

【Java笔记】 深入理解序列化和反序列化

深入理解序列化和反序列化 文章目录深入理解序列化和反序列化1.是什么2.为什么3.怎么做3.1 实现Serializable接口3.2 实现Externalizable接口3.3 注意知识点3.4 serialVersionUID的作用4 扩展1.是什么 序列化&#xff1a;就是讲对象转化成字节序列的过程。 反序列化&#xff…

C++开发,这些GUI库一定不要错过

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store 如果问Python这类集成度非常高的编程语言GUI开发用什么库&#xff0c;可以列举出很多不错的第三方库。 但是&#xff0c;如果这个问题放在C这种基础的编程语言上&#xff0c;很多同学估计一时间都无从…

用Gurobi+python求解设施选址问题(facility location)

参考&#xff1a;Gurobi 官方资源 设施选址&#xff08;Facility Location&#xff09; 1.背景介绍 设施选址问题在许多工业领域如物流&#xff0c;通信等都有应用&#xff0c;在本案例中展示如何解决设施选址问题&#xff0c;决策出仓库的数量和地点&#xff0c;为一些超市…

Crash Consistency on File Systems: 文件系统一致性保证 (1) Journaling File System

文件系统是操作系统中管理用户数据的重要模块。其中一项重要的任务就是确保用户数据的在系统突然崩溃之后&#xff0c;系统能够恢复出完整、一致的用户数据。本文将会分析两种流行的文件系统&#xff0c;Journaling File System 和 Log-structured File System是如何确保数据的…

dataFactory连接mysql详细配置教程

场景&#xff1a;最近项目提出机构用户中其中一个部门下用户人数有20万&#xff0c;加载的时候十分缓慢&#xff0c;本地想重现的一下&#xff0c;这就需要在本地表中生成>20万的数据&#xff0c;搜索了网上的教程写的都是很粗略。 目录 dataFactory连接mysql配置 安装包下…

第二证券|“20cm”涨停!盘中暴涨110%,又有港股暴力拉升

A股商场今日上午窄幅动摇&#xff0c;电子等板块领涨。北向资金半响净买入额到达26.10亿元。 港股商场今日上午动摇也较为温和。不过&#xff0c;仍有个股剧烈动摇。比如浦江世界上午暴升&#xff0c;盘中涨幅一度超过110%。 A股窄幅动摇 电子板块领涨 今日上午A股商场全体体…

STL六大组件之算法

文章目录56、STL六大组件之遍历算法57、STL六大组件之查找算法158、STL六大组件之查找算法259、STL六大组件之统计算法60、STL六大组件之合并算法61、随机数&#xff08;rand&#xff09;和随机数种子&#xff08;srand&#xff09;的理解62、STL六大组件之随机算法(洗牌算法)6…

javaweb笔记

javaweb数据库jdbcmaven数据库 1.chart定长 2.分组查询:where>聚合函数>having 3.分页查询: select 字段列表 from limit 起始索引&#xff0c; 查询条目数 计算公式: 起始索引&#xff08;当前页码-1&#xff09;每页显示的条数 不同数据库分页查询不一样 4.like模糊查…

8种常见python运行错误,看看你中招了没?

人生苦短 我用python 对于刚入门Python的新手同学来说&#xff0c; 在运行代码时总免不了报错。 如何通过报错查找错误代码&#xff1f; 今天给大家总结了一些常见的报错类型&#xff0c; 每种报错都会有标有错误细节和错误行。 大家以后看到了&#xff0c;就更容易找出自…

使用navicat工具生成表的新增字段sql

1、在需要的表右键&#xff0c;设计表 2、点击【添加字段】 3、创建字段及注释&#xff0c;不要点【保存】和CtrlS 4、点击【SQL预览】 5、复制生成的sql语句

iframe 标签

一. 什么是 iframe 1. iframe 是 HTML元素,用于在网页中内嵌另外一个网页. 2. iframe 默认有一个宽高,存在边界. 3. iframe 是一个行内块级元素,可以通过 display 修改. 二. iframe 元素属性 1. src : 指定内联网页的地址 2. frameborder : iframe 默认有个边界,可以设置fram…

深入剖析Linux RCU原理(一)初窥门径

说明&#xff1a; Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 RCU, Read-Copy-Update&#xff0c;是Linux内核中的一种同步机制。RCU常被描述为读写锁的替代品&#xf…

Openssl 1024bit RSA算法---公私钥获取和处理(一)

1.简介 使用OpenSSL生成公私钥文件&#xff0c;然后再将文件中的信息读出的操作。 由于要对设备升级&#xff0c;需要用到RSA算法对一部分验证信息进行加密. 2.使用OpenSSL获取公私钥 我在window系统尝试安装OpenSSL&#xff0c;但是安装不上&#xff0c;我们可以使用linux…

模式识别 第7、8章 特征的选择和提取

基本概念 问题的提出 特征→ 特征空间&#xff1a; 每一个特征对应特征空间的一个维度 &#xff1b;特征越多&#xff0c;特征空间的维度越高原则&#xff1a;在保证分类效果的前提下用尽量少的特征来完成分类基本概念 &#xff08;1&#xff09;特征形成&#xff1a;由仪器…

如何去除图片雾化?给你推荐图片去雾怎么去除的方法

小伙伴们会不会和我一样喜欢外出爬山呢&#xff1f;为了留住美好记忆&#xff0c;我们会在途中拍照记录。但是山上很经常会有雾气&#xff0c;会容易导致我们拍出来的图片模糊不清。那应该怎么办呢&#xff1f;其实&#xff0c;我们只要对图片进行去雾处理就可以很好解决这个问…

[附源码]Nodejs计算机毕业设计基于的校园疫情防控管理Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…