JNA回调

    实际开发中,可能不全都是从Java到本地类库的调用,往往可能还涉及本地代码的回调,这个时候,JNA的回调功能就派上用场了。

    本篇中的JNA回调实例,是在上一篇《初识JNA》的基础上写的,下面涉及到的代码均在之前的例子中添加。

定义回调接口及其对应实现类

    回调接口一定要继承于Callback类,定义的回调方法的方法名绝对不能是hashCode,equals,toString。这个方法名必须是独一无二的。

接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import com.sun.jna.Callback;
/**
* 消息回调接口
*/
public interface IMsgCallback extends Callback {
/**
* C++回调Java代码时会调用到的方法
* @param strArg
*/
void invoke(String strArg);
}

实现类

1
2
3
4
5
6
7
8
9
/**
* 回调类的实现类
*/
public class MsgCallbackImpl implements IMsgCallback {
@Override
public void invoke(String strArg) {
System.out.println("C++回调Java测试,来自C++的内容:" + strArg);
}
}

本地代码中注册回调函数

头文件

1
2
3
4
5
6
7
8
9
10
11
12
// 定义回调函数指针
static int(*MsgCallback)(char* strArg);
/************************************************************************/
/* 注册回调函数 */
/************************************************************************/
__declspec(dllexport) void regisMsgCallback(int(*callback)(char*));
/************************************************************************/
/* 测试回调函数 */
/************************************************************************/
__declspec(dllexport) void testCallback();

    定义了回调函数的指针MsgCallback,可以在需要进行回调的地方调用。

源码文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/************************************************************************/
/* 注册回调函数,把Java中的回调接口加入到此处 */
/************************************************************************/
void regisMsgCallback(int(*callback)(char*))
{
MsgCallback = callback;
}
/************************************************************************/
/* 测试回调函数 */
/************************************************************************/
void testCallback()
{
MsgCallback("C++ callback test.");
}

    在本例中只是从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();
    }

}

    运行此回调测试,得到以下结果。

注意

    上面的例子中,用了简单的逻辑来实现回调,实际应用中可能伴随着复杂的逻辑,此处只是抽丝剥茧。

大爷给小弟的零花钱
显示 Gitment 评论