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、

  • 相关阅读:
    vue 零散记录
    flex布局-弹性布局
    apply 和 call 的用法
    git版本控制系统重新认识
    Windows驱动过滤--kdbclass过滤,寒江独钓加强版
    Socket的select制作多客户端传输(Qt)
    基于g_soap制作的数据下载器,传输速度只有600kb 需改进
    lua中获取数组长度问题
    MySQL存储过程详解 mysql 存储过程(转:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html)
    lua接受C++返回值
  • 原文地址:https://www.cnblogs.com/javaskill/p/5431495.html
Copyright © 2011-2022 走看看