1、关键在于:
使用的 method id 是 子类的 还是 父类的,而 父类methodID的获取 必须使用 父类的class对象。
2、VC6(CPP)的DLL代码:
#include<stdio.h> #include "jniZ_TjniFatherMethod.h" JNIEXPORT void JNICALL Java_jniZ_TjniFatherMethod_NativeFunc(JNIEnv * env, jobject obj, jobject _father) { // 获取obj中对象的class对象 jclass clazzChild = env->GetObjectClass(_father); // 这里返回的是 子类的 Class对象 jmethodID methodIdChild = env->GetMethodID(clazzChild, "Show", "()V"); // 这里获取的是 子类的 Show()方法的ID jclass clazzFather = env->GetSuperclass(clazzChild); // 获取 父类的 Class对象 jmethodID methodIdFather = env->GetMethodID(clazzFather, "Show", "()V"); // 这里获取的是 父类的 Show()方法的ID // 1、使用的是 子类的 method id // (1) 两个参数 env->CallVoidMethod(_father, methodIdChild); // 子类的 Show()方法 // (2) 三个参数 env->CallNonvirtualVoidMethod(_father, clazzFather, methodIdChild); // 子类的 Show()方法 // 1、使用的是 父类的 method id // (3) env->CallVoidMethod(_father, methodIdFather); // 子类的 Show()方法 // (4) env->CallNonvirtualVoidMethod(_father, clazzFather, methodIdFather);// 父类的 Show()方法 // (5) env->CallNonvirtualVoidMethod(_father, clazzChild, methodIdFather);// 父类的 Show()方法 // ZC: 可见,调用 子类 还是 父类的方法,关键看 methpd id 属于谁 ... }
3、Java代码:
package jniZ; public class TjniFatherMethod { public native void NativeFunc(Tparent _father); public static void main(String[] args) { Tchild01 child01 = new Tchild01(); ((Tparent)child01).Show(); System.out.println(" *** *** *** "); System.loadLibrary("JniFatherMathod_VC6"); TjniFatherMethod jniZ = new TjniFatherMethod(); jniZ.NativeFunc((Tparent)child01); } } class Tparent { public void Show() { System.out.println("Tparent"); } } class Tchild01 extends Tparent { public void Show() { System.out.println("Tchild01"); } }
4、Java控制台输出:
Tchild01
*** *** ***
Tchild01
Tchild01
Tchild01
Tparent
Tparent
5、