JNI_Z_06_方法的操作(没有String类型的参数)_父类的同名方法

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、