JavaDemo——通过jna使用dll的回调函数

别再到处找海康SDK了!手把手教你从官网下载、IDEA配置到Demo运行(附HCNetSDK.dll路径修改避坑) 本文详细介绍了海康威视SDK从官网下载到IDEA配置的全流程,包括HCNetSDK.dll路径修改等常见问题的解决方案。通过手把手教程和避坑指南,帮助开发者快速掌握海康SDK的部署与调试技巧,提升开发效率。 阅读详情

一、c++部分

首先编写测试用的dll

头文件MyDll.h

#include <iostream>

using namespace std;

extern "C" 
{
	__declspec(dllexport) typedef void(*mycallback)(char* chptr, int z);
	__declspec(dllexport) void* test(int x, int y, mycallback cb);
}

源文件MyDll.cpp

#include"MyDll.h"

void* test(int x, int y, mycallback cb)
{
	int addresult = x + y;
	cout << ">>result=" << addresult << endl;
	(*cb)("hello world", addresult);
	cout << ">>callback finished" << endl;
	return NULL;
}

生成配置:

注:

1.平台要配置成跟jdk位数一致的,否则会有“%1 不是有效的 Win32 应用程序。”异常如下:

2.据说jna要使用Releas版本的dll,不知我的debug为啥也好使。

生成dll

 

二、java部分

maven导入jna的包

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

编写调用dll的接口:MyDllInterface.java

/**
 * 2019年12月24日下午2:11:37
 */
package testDllCallback;

import com.sun.jna.Callback;
import com.sun.jna.Library;
import com.sun.jna.Native;

/**
 * @author XWF
 *
 */
public interface MyDllInterface extends Library{
	
	public static MyDllInterface myDll = Native.load("C:\\Users\\Administrator\\Documents\\Visual Studio 2015\\Projects\\MyDLLSolution\\x64\\Release\\testDLL.dll", MyDllInterface.class);
	
	public void test(int a, int b, Callback myCallback);
	
}

编写回调函数的接口:IMyDllCallback.java

/**
 * 2019年12月24日下午2:14:25
 */
package testDllCallback;

import com.sun.jna.Callback;
import com.sun.jna.Pointer;

/**
 * @author XWF
 *
 */
public interface IMyDllCallback extends Callback {

	public void myCallback(Pointer ptr, int z);
	
}

编写回调函数的实现:MyDllCallbackImpl.java

/**
 * 2019年12月24日下午2:18:12
 */
package testDllCallback;

import com.sun.jna.Pointer;

/**
 * @author XWF
 *
 */
public class MyDllCallbackImpl implements IMyDllCallback {

	@Override
	public void myCallback(Pointer ptr, int z) {
		System.out.println("java收到ptr=" + ptr.getString(0));
		System.out.println("java收到z=" + z);
	}

}

编写测试Demo:TestDllCallBack.java

/**
 * 2019年12月24日上午9:51:26
 */
package testDllCallback;

/**
 * @author XWF
 *
 */
public class TestDllCallBack {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		IMyDllCallback callback = new MyDllCallbackImpl();
		System.out.println(MyDllInterface.myDll.toString());
		MyDllInterface.myDll.test(2, 3, callback);
	}

}

结果:

调用 C++ DLL 中的函数接口和回调函数 在 C# 中,可以通过 Platform Invoke (P/Invoke) 技术来调用 C++ 动态链接库(DLL)中的函数接口和回调函数。下面将详细介绍如何在 C# 中使用 P/Invoke 调用 C++ DLL 中的函数接口和回调函数,并提供相应的源代码示例。在 C# 代码中,我们需要声明与 C++ DLL 中的函数接口和回调函数对应的函数签名。声明了一个代表回调函数的委托类型,用于与 C++ DLL 中的回调函数进行交互。在 C# 代码中,我们可以直接调用声明的函数接口和回调函数。 阅读详情

相关推荐

使用JNA解决回调问题的高级技巧

首先,我们定义了回调接口,并将其注册到JNA中。然后,我们实现了回调接口,并通过回调实例将回调函数传递给本地库。使用JNA的回调功能,我们可以方便地在Java和本地代码之间进行双向通信,从而实现更强大的功能。本文将详细介绍如何解决JNA中的回调问题,并提供相应的源代码示例。当本地库中触发回调时,回调方法将被调用,并执行相应的操作。我们首先创建一个回调实例,然后将其传递给本地库中的回调函数。接下来,我们需要将回调接口注册到JNA中,以便JNA能够正确地处理回调函数。方法,该方法在接收到回调时打印回调值。

DevSavantX的博客 590

DLL中的回调函数实现

DLL中的回调函数实现DLL文件中存放的是各类程序的函数实现过程,当程序需要调用函数时需要先载入DLL,然后取得函数地址,最后进行调用。但是有时候我们需要DLL和程序进行通信,将应用程序的某些功能提供给DLL使用,这时就可以使用回调函数。 比如应用程序A调用动态链接库D,同时需要将D中的一些日志信息反馈给A进行处理。这时可以在A中设置写日志的回调函数提供给DLL。 一、调用程序中操作 应用程序提

zt_xcyk的专栏 6231

基于Springboot集成海康SDK,开发客流量统计WEB应用

Java WEB项目中用到海康的客流量统计相机,需要对接相机,取到客流统计人数信息。海康官方只提供了简单的Demo实例,JavaDemo中缺失的比较多,这里将对接过程总结出来供大家参考。如需源代码请加qq沟通:1609091580。 最终实现效果如下: 一、开发环境 IDEA、Springboot框架、JDK1.8.0、Tomcat、海康SDK、海康摄像...

hengju的博客 1238

c语言调用dll 回调函数,DLL函数调用以及回调函数设置

在window开发中,紧张要将一些库编译成DLL以共享给其他程序使用,那么怎样调用DLL函数1.只是普通调用DLL中的函数1.1在VS2012中创建一个DLL程序,如MyDLL。新建一个MyDLL.h头文件,加入如下代码:extern "C" _declspec(dllexport) void test();在源文件中,添加如下代码:#include "MyDLL.h"#include void ...

weixin_39777967的博客 1911

DLL中实现回调函数和测试程序

在DLL中实现回调函数,在回调函数中显示Dll线程循环运行的次数,测试程序使用Win32控制台,在测试程序中一定要加暂停语句,不然无法看到回调函数的效果。

CCS20实战入门:第一个工程搭建示例

通过实际操作演示如何在ccs20中创建并配置首个开发项目,涵盖环境设置与基础调试步骤,帮助新手快速上手ccs20集成开发环境,提升嵌入式开发效率。

weixin_31185473的博客 888

Java使用JNA方式调用DLL

1. 引包 <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.5.0</version> ...

null 2387

PCB过孔电流承载解析:完整指南与数据参考

深入解析PCB过孔的电流承载能力,结合实际应用场景提供可靠设计参考。涵盖影响载流的关键因素,并整理实用的pcb过孔与电流对照一览表,帮助工程师优化布局与布线。

weixin_35677363的博客 632

Java相机下载_相机SDK-JAVA 监控相机SDK调用DEMO - 下载 - 搜珍网

文件名大小更新时间IPNC_NET_SDK_Java02018-03-02IPNC_NET_SDK_Java\com.xhb.hardware.liugl02018-03-02IPNC_NET_SDK_Java\com.xhb.hardware.liugl\.classpath4582017-11-14IPNC_NET_SDK_Java\com.xhb.hardware.liugl\.projec...

weixin_28917279的博客 158

AutoCAD 2024 LISP实用技巧:自定义快捷命令与高效绘图工具集

本文详细介绍了如何在AutoCAD 2024中部署和使用LISP脚本,打造高效绘图工具集。通过自定义快捷命令,如WFF(超级文字查找替换)、GQT(图层隔离)和LLTJ(智能长度统计),可大幅简化图层管理、文字编辑和测量统计等重复性操作,显著提升绘图效率。

gan8painter的博客 322

如何用 OBProxy 实现 OceanBase 的最佳路由策略

本文基于业务中一类常见的路由问题展开,对OceanBase的路由功能及对应配置项做详细介绍,指导用户在业务实践中如何正确的配置路由策略及快速排查路由问题

OceanBase分布式数据库的博客 1688

2020-03-11

Java WEB项目中用到海康的客流量统计相机,需要对接相机,取到客流统计人数信息。海康官方只提供了简单的Demo实例,JavaDemo中缺失的比较多,这里将对接过程总结出来供大家参考。如需源代码请加qq沟通:1609091580。 最终实现效果如下: 一、开发环境 IDEA、Springboot框架、JDK1.8.0、Tomcat、海康SDK、海康摄像机iDS-2CD6810。 ...

hengju的博客 696

别再手动挂载NPU了!手把手教你用Ascend-Docker-Runtime一键启动昇腾AI容器

本文详细介绍了如何使用Ascend-Docker-Runtime一键启动昇腾AI容器,大幅简化NPU设备挂载流程。通过环境变量ASCEND_VISIBLE_DEVICES,开发者可以灵活指定NPU设备,提升开发效率。文章还提供了安装配置指南、高级使用技巧和常见问题排查方法,帮助开发者快速掌握这一高效工具。

weixin_42662605的博客 253

C++调用带有回调函数的dll

std::cout << "onProcess回调函数被调用" << std::endl;std::cout << "无法加载DLL文件" << std::endl;std::cout << "无法找到DLL函数" << std::endl;3. DLL函数的原型应匹配您在C++代码中声明的 `typedef` 语句中的函数原型。1. 将 "your_dll_name.dll" 替换为要调用的DLL的文件名。// 获取DLL函数地址。// 进行自定义操作。// 调用DLL函数。// 声明DLL函数原型。

sulei_8310的专栏 691

Zemax非序列模式微透镜阵列仿真:从建模到优化完整指南

光线追迹是光学系统仿真的核心技术,其原理基于几何光学与物理光学的光线传播模型,通过精确计算光线在光学元件中的折射、反射与散射路径,实现对系统性能的预测与评估。在微透镜阵列等复杂多通道光学系统中,传统序列模式因光线路径受限而难以准确模拟串扰与杂散光,非序列光线追迹技术则凭借其灵活的空间传播机制成为关键手段。该技术广泛应用于激光整形、光束匀化、3D传感及光场成像等领域,能够有效支持阵列结构设计与优化。Zemax非序列模式为微透镜阵列仿真提供了完整的建模、优化与公差分析流程,是光学工程师进行复杂系统设计的核心工具

weixin_29967003的博客 336

华为OD技术面真题 - Python开发 - 1

汇总华为OD技术面八股Python八股,高频技术真题并提供详细解答。

qq_45776114的博客 1719

c# DLL接口回调函数

一:回调函数1:DLL内部    //声明回调函数    typedef void (CALLBACK* ONSERIESDATA)(BYTE* buf, DWORD dwBufLen, DWORD dwTime, bool bDown);    //DLL接口中的传入回到函数    extern "C" __declspec(dllexport) void WIN

chpdirector84的专栏 4326

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++ dll里调用回调函数

主要分步骤 1、dll里面建立相关函数指针; 2、主函数写入回调函数; 3、主函数中将回调函数赋值给dll的指针; 4、dll中调用指针; 1、dll里面建立相关函数指针; 2、主函数写入回调函数; 3、主函数中将回调函数赋值给dll的指针; 启用回调函数 4、dll中调用指针; 主函数使用 ...

yang_xiaobai的博客 2000

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

动态库DLL回调函数实现示例

在DLL开发中,对涉及到具体的业务时,我们通常希望上层应用程序来处理,此时,使用回调函数可解决该需求。下面基于VC++ 6.0来实现DLL回调函数的使用例子。 一、建立DLL 新建一个“Win32 Dynamic=Link Library”空项目,分别添加CallBackAPI.h和CallBackAPI.cpp文件到Header Files和Source Files中,添加导出函数: ...

psy361212的专栏 4418

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++使用dll的回调函数

在编写代码时,使用动态库可以提高代码项目的可维护性。但在使用动态库时存在需要对使用外部函数作为输入的时候,此时需要使用回调函数进行回调,完成代码的具体功能。

日常搬砖 836

C#调用C++动态库接口函数和回调函数方法

这篇文章主要介绍了C#调用C++动态库接口函数和回调函数方法,通过C++端编写接口展开内容,文章介绍详细具有一定的参考价值,需要的小伙伴可以参考一下当前C已经写好了一个动态库,完成了产品开发需求,C#需要调用C编写的动态库DLL接口,开发出完整的软件,DLL动态库里包含了普通接口函数,回调函数。win10 64位 、VS2017。

LongtengGensSupreme博客 2153

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

Java调用C++动态链接库dll;Java调用硬件接口;Java调用dll 回调函数获取数据。

单身狗的清香 2564

C#向自己调用的c++Dll传递回调函数及其调用

参考: 【1】c# 调用c++带有回调函数方法的实现 1 目的及方法 C#程序调用了一个C++的dll,向给dll传递一个回调函数,供dll在一定时机回调C#中的程序执行。 方法见参考【1】。 2 注意事项 (1)必须传递一个静态的委托变量,不能是函数名 直接传递函数名称是不行的,那样在回调的时候会出现那个那个函数已经被回收的异常。主要原因,应该是前拷贝之类的东西,被释放掉了。 因为是静态的,是各...

kevinshift的博客 1659

JNA ---jna中的回调方法

简介 什么是 callback 呢?简单点说 callback 就是回调通知,当我们需要在某个方法完成之后,或者某个事件触发之后,来通知进行某些特定的任务就需要用到 callback 了。 最有可能看到 callback 的语言就是 javascript 了,基本上在 javascript 中,callback 无处不在。为了解决 callback 导致的回调地狱的问题,ES6 中特意引入了 promise 来解决这个问题。 为了方便和 native 方法进行交互,JNA 中同样提供了 Callbac

徐本锡的专栏 32万+

回调函数; 动态库dll提供回调函数接口

Dll可以提供回调函数的接口,供用户注册一个函数func, 然后,dll可以以一定的频率调用func,例如,将最新数据通过该函数给传递给用户; 《Api design for- c plus》2.5.5: In C/C++, a callback is a pointer to a function within module A that is passed to module B, so that B can invoke the function in A at an appropriate ti

Peace 720
上一篇: JavaDemo——使用commons.net的ftp功能
下一篇: JavaDemo——修改文件名
FlyLikeButterfly
博客等级 码龄9年 223粉丝 209原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值