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
相关推荐
2501_941875286 分钟前
从资源隔离到多租户安全的互联网工程语法构建与多语言实践分享
java·开发语言
xiaolyuh12317 分钟前
ThreadLocalMap 中弱引用被 GC 后的行为机制解析
java·jvm·redis
不知疲倦的仄仄26 分钟前
第一天:从 ByteBuffer 内存模型到网络粘包处理实战
java·网络·nio
Tinachen8827 分钟前
YonBIP旗舰版本地开发环境搭建教程
java·开发语言·oracle·eclipse·前端框架
似霰28 分钟前
HIDL Hal 开发笔记4----Passthrough HALs 实例分析
android·framework·hal
星火开发设计35 分钟前
堆排序原理与C++实现详解
java·数据结构·c++·学习·算法·排序算法
七七powerful43 分钟前
docker28.1.1和docker-compose v.2.35.1安装
java·docker·eureka
小白学大数据1 小时前
百科词条结构化抓取:Java 正则表达式与 XPath 解析对比
java·开发语言·爬虫·正则表达式
louisgeek1 小时前
Git 查询 Tag 列表
android
2501_941807261 小时前
在迪拜智能机场场景中构建行李实时调度与高并发航班数据分析平台的工程设计实践经验分享
java·前端·数据库