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

一、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);
	}

}

结果:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值