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