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("\n*** *** ***\n"); 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、

最新文章

  1. 响应式Web设计 - 布局
  2. 使用C#创建快捷方式
  3. Spark Mllib逻辑回归算法分析
  4. java连接sqL2008 数据库实例
  5. Android学习总结——SQLite
  6. git分支综述
  7. [算法题] Remove Element
  8. 很考验人的java内存加载面试题
  9. @Data 注解引出的 lombok 小辣椒
  10. Programming In Scala笔记-第七章、Scala中的控制结构
  11. Tomcat系列(10)——Tomcat主要设计模式5种(外观,责任链,观察者,模板方法,命令模式)
  12. [vue]vue基础复习项案例stepbystep
  13. 水管工游戏——dfs
  14. C-Linux_定时器示例使用
  15. 详解JS设计模式
  16. TortoiseGit推送代码到Gerrit的过程
  17. 编译用到boost相关的东西,问题的解决;以及和googletest库
  18. Git:创建与合并分支
  19. 结对编程--四则运算(Java)梅进鹏 欧思良
  20. ul li的添加 删除 复制 clone()

热门文章

  1. SQL Server常用函数汇总
  2. java反射——字段
  3. 巨蟒python全栈开发-第9天 初识函数
  4. window安装redis数据库
  5. What is tail-recursion
  6. 六顶思维帽的思考,敏捷开发?——By Me
  7. C++对象模型那点事儿(布局篇)
  8. 一次rna-seq的过程-知乎live转
  9. selet2使用大全
  10. Java架构搜集