Android开发中调用一个类中没有公开的方法,可以进行反射调用,而JNI开发中C调用java的方法也是反射调用。
C代码回调Java方法步骤:
①获取字节码对象(jclass (FindClass)(JNIEnv, const char*);)
②通过字节码对象找到方法对象(jmethodID (GetMethodID)(JNIEnv, jclass, const char, const char);)
③通过字节码文件创建一个object对象(该方法可选,方法中已经传递一个object,如果需要调用的方法与本地方法不在同一个文件夹则需要新创建object(jobject (AllocObject)(JNIEnv, jclass);),如果需要反射调用的java方法与本地方法不在同一个类中,需要创建该方法,但是如果是这样,并且需要跟新UI操作,例如打印一个Toast 会报空指针异常,因为这时候调用的方法只是一个方法,没有actiivty的生命周期。)
④通过对象调用方法,可以调用空参数方法,也可以调用有参数方法,并且将参数通过调用的方法传入(void (CallVoidMethod)(JNIEnv, jobject, jmethodID, ...);)
/**
调用java中Int方法
*/
JNIEXPORT void JNICALLJava_com_mao_ccalljava_JNI_callbackIntmethod(JNIEnv *env, jobject object) {
jclass clzz=(*env)->FindClass(env,"com/mao/ccalljava/JNI");
jmethodID methodID=(*env)->GetMethodID(env,clzz,"add","(II)I");
int result=(*env)->CallIntMethod(env,object,methodID,3,4);
//logcat 打印相加返回的结果
LOGD("RESLUT = %d",result);
}