在JNI中,可以通过传递一个Java接口对象的引用给C++代码,并在C++代码中调用该接口对象的方法,实现JAVA层监听C++数据变化,下面是一个简单的示例:
-
在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) } }
-
使用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); }
-
在Java代码中调用C++代码,并将接口对象作为参数传递给C++代码:文章来源:https://www.toymoban.com/news/detail-652796.html
TestLib.init(object : TestLib.CallBack{ override fun onData(count: Int, data: String) { Log.i(TAG,"onData ${count} ${data}") } })
-
执行后日志打印:文章来源地址https://www.toymoban.com/news/detail-652796.html
test com.test.jnitest I Hello MainActivity com.test.jnitest I onData 200 HelloWorld
到了这里,关于Android JNI传递CallBack接口并接收回调的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!