Android JNI传递CallBack接口并接收回调

在JNI中,可以通过传递一个Java接口对象的引用给C++代码,并在C++代码中调用该接口对象的方法,实现JAVA层监听C++数据变化,下面是一个简单的示例:

  1. 在Java代码中定义一个CallBack接口和JNI方法

    复制代码
     class TestLib {
        companion object{
            init {
                System.loadLibrary("jnitest")
            }
        }
        external fun stringFromJNI(): String
        external fun init(callBack: CallBack)
        interface CallBack{
            fun onData(count:Int,data:String)
        }
    }
  2. 使用JNI实现将Java接口对象传递给C++代码,并在C++代码中调用接口方法。

    在C++代码中,需要使用JNI函数GetMethodID获取接口方法的ID,并使用CallVoidMethod调用接口方法:

    复制代码
     extern "C"
     JNIEXPORT void JNICALL
     Java_com_test_jnitest_TestLib_init(JNIEnv *env, jobject thiz, jobject call_back) {
         // 获取接口类及其方法ID
         LogUtil::info("test", "Hello");
         jclass  callClass = env->GetObjectClass(call_back);
         jmethodID  callMethod = env->GetMethodID(callClass,"onData","(ILjava/lang/String;)V");
         // 调用接口方法
         jint arg1 = 200; // 第一个参数为 int 类型
         jstring arg2 = env->NewStringUTF("HelloWorld"); // 第二个参数为 String 类型
         env->CallVoidMethod(call_back, callMethod,arg1,arg2);
         // 释放局部引用
         env->DeleteLocalRef(arg2);
     }
  3. 在Java代码中调用C++代码,并将接口对象作为参数传递给C++代码:

    复制代码
     TestLib.init(object : TestLib.CallBack{
                 override fun onData(count: Int, data: String) {
                    Log.i(TAG,"onData ${count} ${data}")
                 }
             })
  4. 执行后日志打印:

    复制代码
     test                    com.test.jnitest                     I  Hello
     MainActivity            com.test.jnitest                     I  onData 200 HelloWorld
相关推荐
向着光芒的女孩2 小时前
【IDEA】关不了的Proxy Authentication弹框探索过程
java·ide·intellij-idea
Filotimo_2 小时前
Spring Boot 整合 JdbcTemplate(持久层)
java·spring boot·后端
李慕婉学姐3 小时前
【开题答辩过程】以《“饭否”食材搭配指南小程序的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·spring·小程序
abments4 小时前
pgsql timestamp without time zone > character varying解决方案
java
sanggou4 小时前
大数据量查询处理方案 - 内存优化与高效展示
java
没有bug.的程序员5 小时前
Java 字节码:看懂 JVM 的“机器语言“
java·jvm·python·spring·微服务
-大头.5 小时前
深入理解 Java 内存区域与 JVM 运行机制
java·jvm
没有bug.的程序员5 小时前
JVM 整体架构:一套虚拟机的心脏与血管
java·jvm·spring boot·spring cloud·架构
晨枫阳5 小时前
不同语言的元组对比
java·前端·javascript
悟能不能悟5 小时前
怎么在idea合并2个个branch
java·ide·intellij-idea