实际开发中,可能不全都是从Java到本地类库的调用,往往可能还涉及本地代码的回调,这个时候,JNA的回调功能就派上用场了。
本篇中的JNA回调实例,是在上一篇《初识JNA》的基础上写的,下面涉及到的代码均在之前的例子中添加。
定义回调接口及其对应实现类
回调接口一定要继承于Callback类,定义的回调方法的方法名绝对不能是hashCode,equals,toString。这个方法名必须是独一无二的。
接口
|
|
实现类
|
|
本地代码中注册回调函数
头文件
|
|
定义了回调函数的指针MsgCallback,可以在需要进行回调的地方调用。
源码文件
|
|
在本例中只是从Java里面调用了一个测试方法testCallback()来触发回调,实际应用中可以根据业务来实际操作。
Java中注册回调函数
import com.sun.jna.Native;
/**
* JNA测试
*/
public class Test {
@org.junit.Test
public void testEasemob() throws InterruptedException {
JNADemo jnaDemo = Native.loadLibrary("JavaCpp", JNADemo.class);
// 调用Java接口中的方法,执行C++中的方法体
// jnaDemo.test1();
//
// // 向C++类库中传递字符串参数,并得到字符串返回值
// String cpprt = jnaDemo.test2("FROM Java");
//
// System.out.println("来自C++动态类库:" + cpprt);
// 注册消息回调接口
jnaDemo.regisMsgCallback(new MsgCallbackImpl());
// 测试回调接口中的回调函数
jnaDemo.testCallback();
}
}
运行此回调测试,得到以下结果。
注意
上面的例子中,用了简单的逻辑来实现回调,实际应用中可能伴随着复杂的逻辑,此处只是抽丝剥茧。