今天来说说 native 中的代码是如何调用 java 侧代码的。
在看 setEnabled 代码的时候,我们了解到,最终在函数 EffectHandle::setEnabled 中会调用 java 侧的函数,
将状态改变的事件通知到 java 侧。
今天就以 AudioEffect 中的 native 侧调用 java 函数作为例子,来说明 JNI 中的 callback 函数。
#######################说明################################
###########################################################
&&&&&&&&&&&&&&&&&&&&&&&总结&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
上面列出了 native 代码中调用 java 函数的过程。
其实,从 java 侧对象的创建时机来看, JNI 回调分为两种情况:
java 对象在 java 侧创建
java 对象中 JNI 中创建。
一、java 对象在 java 侧创建
我们上面介绍的 AudioEffect 中的回调,就是这种方式。
这种情况下,主控程序在 java 侧。
1、调用函数 env->FindClass 找到指定的类。
2、调用 env->NewGlobalRef 函数获取对象的引用。
3、调用 env->GetStaticMethodID 函数获取 java 侧的函数。
4、在 JNI 中定义一个 callback 函数调用 java 侧的函数。
5、创建 native 侧对象的时候将 callback 函数作为参数传给 native 对象的构造函数。
6、 native 对象就可以通过 callback 函数来调用 java 侧的函数。
二、java 对象中 JNI 中创建
这种情况下,主控程序在 native 侧。
1、调用函数 env->FindClass 找到指定的类。
2、调用 env->NewGlobalRef 函数获取对象的引用。
3、调用函数 env->GetMethodID 得到 java 侧创建对象的函数。
4、调用函数 env->NewObject ,通过第三步中得到的函数创建 java 侧对象。
5、调用 env->GetStaticMethodID 函数获取 java 侧的函数。
6、在 JNI 中定义一个 callback 函数调用 java 侧的函数。
7、创建 native 侧对象的时候将 callback 函数作为参数传给 native 对象的构造函数。
8、 native 对象就可以通过 callback 函数来调用 java 侧的函数。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&