JNI 接口回调
这里主要演示从 Java 层传入自定义listener,然后由 c/c++ 层在某一时期某一线程主动调用 listener 的回调函数,完成异步回调的功能。
关于 jni 的其他部分基础知识本文不做详细介绍。
Java 层定义代码
-
java-native 函数以及接口定义
package com.jnidemo; public class Greet { static { System.loadLibrary("jni_demo"); } public native void native_say_hello(GreetListener listener); public interface GreetListener { /** * 这里为了演示自定义 Callback 的用法,使用了自定义 Java-Callback 类作为回调参数, * 可直接使用基本类型或者其他引用类型做回调参数,根据自己的业务需求决定。 */ void onGreetReceive(GreetCallback greet); } }
-
java 自定义 Callback 类
package com.jnidemo; public class GreetCallback { private int greetID; private String greetMsg; public GreetCallback(int greetID, String greetMsg) { this.greetID = greetID; this.greetMsg = greetMsg; } }
c++ 层实现代码
-
动态注册 native 实现函数
const char *NATIVE_GREET_CLASS_NAME = "com/jnidemo/Greet"; static JNINativeMethod gMethods_Greet[] = { { "native_say_hello", "(Lcom/jnidemo/Greet$GreetListener;)V", (void *)say_hello_jni}