前言:今天讲解如何通过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);
}
运行:
-----------完----------