JNI开发之调用java实力类父类的方法

前言:今天讲解如何通过jni调用java实例父类的方法。

---------------分割线----------

Grandpa类:

package com.fly;

public class Grandpa {
	public void eat() {
		System.out.println("我是爷爷 正在抽烟");
	}
}

Father类:

package com.fly;

public class Father extends Grandpa {
	public void eat() {
		System.out.println("我是父亲 正在喝酒");
	}
}

Child类:
package com.fly;

public class Child extends Father {
	@Override
	public void eat() {
		System.out.println("我是孩子 我在喝饮料");
	}
}
TestJni类:
	Child child;

	public native void callFathorMethod();

	public static void main(String[] args) {
		TestJni m = new TestJni();
		m.child = new Child();
		m.callFathorMethod();
	}

	// 加载动态库
	static {
		System.loadLibrary("JNI");
	}

C代码:
#include"com_fly_TestJni.h" 

JNIEXPORT void JNICALL Java_com_fly_TestJni_callFathorMethod
(JNIEnv *env, jobject job){
	//获取对象class 
	jclass fly_clas = (*env)->GetObjectClass(env, job);
	//获取属性id
	jfieldID child_id = (*env)->GetFieldID(env, fly_clas, "child", "Lcom/fly/Child;");
	//获取属性引用
	jobject child_obj = (*env)->GetObjectField(env, job, child_id);
	//这里写爷爷 包名。类名 那么 调用CallNonvirtualObjectMethod时候那么会调用 爷爷的eat 
	// 如果这里写 com/fly/father 那么调用父亲的eat
	jclass child_class2 = (*env)->FindClass(env, "com/fly/Grandpa");
	//得到方法id
	jmethodID methodid = (*env)->GetMethodID(env, child_class2, "eat", "()V");

	//获取调用对象class //我发现这里第二个参数 随便写一个存在的类的包名类名,都可以调用CallNonvirtualObjectMethod
	//并且调用对应的child_class2方法 
	// 如果谁知道的为什么 的话还请告诉我
	jclass child_class1 = (*env)->FindClass(env, "com/fly/Grandpa");
	//调用爷爷 的eat方法
	(*env)->CallNonvirtualObjectMethod(env, child_obj, child_class1, methodid);
	
}
运行:


-----------完----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等待着冬天的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值