当前位置: 首页 > news >正文

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

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

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

     class TestLib {companion object{init {System.loadLibrary("jnitest")}}external fun stringFromJNI(): Stringexternal 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 JNICALLJava_com_test_jnitest_TestLib_init(JNIEnv *env, jobject thiz, jobject call_back) {// 获取接口类及其方法IDLogUtil::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  HelloMainActivity            com.test.jnitest                     I  onData 200 HelloWorld
    
http://www.lryc.cn/news/130378.html

相关文章:

  • 机器学习:特征工程之特征预处理
  • 高级艺术二维码制作教程
  • 每日一题leetcode--使循环数组所有元素相等的最少秒数
  • tauri-react:快速开发跨平台软件的架子,支持自定义头部UI拖拽移动和窗口阴影效果
  • k8s 自身原理之 Service
  • arduino Xiao ESP32C3 oled0.96 下雪花
  • ElasticSearch索引库、文档、RestClient操作
  • Effective Java 案例分享(九)
  • SpringBoot复习:(56)使用@Transactional注解标记的方法的执行流程
  • JVM——引言+JVM内存结构
  • open cv学习 (十)图形检测
  • 【C语言】字符函数和字符串函数
  • 前馈神经网络正则化例子
  • spring的核心技术---bean的生命周期加案例分析详细易懂
  • 【Maven教程】(一)入门介绍篇:Maven基础概念与其他构建工具:理解构建过程与Maven的多重作用,以及与敏捷开发的关系 ~
  • 今天,谷歌Chrome浏览器部署抗量子密码
  • SUMO traci接口控制电动车前往充电站充电
  • 现代CSS中的换行布局技术
  • 简单理解Python中的深拷贝与浅拷贝
  • C++之std::pair<uint64_t, size_t>应用实例(一百七十七)
  • 前端打开后端返回的HTML格式的数据
  • How to deal with document-oriented data
  • Http 状态码汇总
  • mysql自定义实体类框架
  • 批量将Excel中的第二列内容从拼音转换为汉字
  • 消息推送:精准推送,提升运营效果,增添平台活力
  • [保研/考研机试] KY43 全排列 北京大学复试上机题 C++实现
  • Java将时间戳转化为特定时区的日期字符串
  • 【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字
  • 通过 kk 创建 k8s 集群和 kubesphere