多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
Java_InstanceMethodCall_nativeMethod函数实现展示了调用一个对象实例方法需要的两个步骤: * 原生方法首先调用JNI方法GetMethodID.GetMethodID在给定类中查找目标方法。这个查找是基于方法名称和方法类型的描述符的。如果方法不存在,GetMethodID将会返回NULL,原生代码返回之后就会触发从InstanceMethodCall.nativeMethod中抛出NoSuchMethodError. * 原生方法接下来调用CallVoidMethod. CallVoidMethod调用了一个返回void类型的实例方法。你需要传递实例对象,方法ID以及方法实参(虽然以上实例代码中没有实参)给CallVoidMethod. 除了CallVoidMethod,JNI也支持其他返回类型的方法调用函数。例如,如果你调用的函数返回int类型,你可以选择使用CallIntMethod.同样,你可以使用CallObjectMethod来调用那些返回对象的方法,包括java.lang.String实例以及数组等。 你可以可以使用Call<Type>Method族函数来调用接口方法。但是你必须首先获取接口方法的Method ID.以下代码段,在一个java.lang.Thread实例上调用了Runnable.run方法: ~~~ jobject thd = ...; /* a java.lang.Thread instance */ jmethodID mid; jclass runnableIntf = (*env)->FindClass(env, "java/lang/Runnable"); if(!runnableIntf) { ... /* error handling */ } mid = (*env)->GetMethodID(env, runnableIntf, "run", "()V"); if(!mid) { ... /* error handling */ } (*env)->CallVoidMethod(env, thd, mid); ... /*check for possible exceptions */ ~~~ 在3.3.5节我们已经提到FindClass函数返回一个命名类的引用,在这里我们使用它获取到一个命名接口的引用。