JNI_Z_06_方法的操作(没有String类型的参数)_父类的同名方法
2024-09-27 06:37:48
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、
最新文章
- 响应式Web设计 - 布局
- 使用C#创建快捷方式
- Spark Mllib逻辑回归算法分析
- java连接sqL2008 数据库实例
- Android学习总结——SQLite
- git分支综述
- [算法题] Remove Element
- 很考验人的java内存加载面试题
- @Data 注解引出的 lombok 小辣椒
- Programming In Scala笔记-第七章、Scala中的控制结构
- Tomcat系列(10)——Tomcat主要设计模式5种(外观,责任链,观察者,模板方法,命令模式)
- [vue]vue基础复习项案例stepbystep
- 水管工游戏——dfs
- C-Linux_定时器示例使用
- 详解JS设计模式
- TortoiseGit推送代码到Gerrit的过程
- 编译用到boost相关的东西,问题的解决;以及和googletest库
- Git:创建与合并分支
- 结对编程--四则运算(Java)梅进鹏 欧思良
- ul li的添加 删除 复制 clone()