zoukankan      html  css  js  c++  java
  • 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、

  • 相关阅读:
    Android:Service通知Activity更新界面
    greendao 查询之数据去重
    Android GreenDao 深查询 n:m 的关系
    java 获取当天(今日)零点零分零秒
    Android Theme.Dialog 到光 AppCompatDialog
    Android 如何利用Activity的Dialog风格完成弹出框设计
    上周热点回顾(9.14-9.20)团队
    .NET跨平台之旅:将示例站点从ASP.NET 5 Beta5升级至Beta7团队
    上周热点回顾(9.7-9.13)团队
    上周热点回顾(8.31-9.6)团队
  • 原文地址:https://www.cnblogs.com/javaskill/p/5431495.html
Copyright © 2011-2022 走看看