1. 程式人生 > >jni 利用委託調java方法(第一篇)

jni 利用委託調java方法(第一篇)

jni程式碼:

extern "C"
JNIEXPORT void JNICALL
Java_com_ipcamer_testsetdata_HelloWorld_sayHello(JNIEnv *env, jobject obj) {

    jclass helloworld_clazz = env->GetObjectClass(obj);
    jfieldID id_p = env->GetFieldID(helloworld_clazz, "p", "Lcom/ipcamer/testsetdata/Father;");
    jobject p = env->GetObjectField(obj, id_p);
    jclass clazz_Father = env->FindClass("com/ipcamer/testsetdata/Father");
    jmethodID id_Father_function = env->GetMethodID(clazz_Father, "function", "()V");
    env->CallVoidMethod(p, id_Father_function);
}

java程式碼:

package com.ipcamer.testsetdata;

/**
 * Created by zhu on 2018/9/18.
 */

public class Father {
    public void function(){
        System.out.println("father...");
    }
}
package com.ipcamer.testsetdata;

/**
 * Created by zhu on 2018/9/18.
 */

public class Child extends Father {
    @Override
    public void function() {
        System.out.println("child...");
    }
}
package com.ipcamer.testsetdata;

/**
 * Created by zhu on 2018/9/18.
 */

public class HelloWorld {
    public native void sayHello();// 本地方法宣告。
    //試圖用子類的例項去執行父類被覆蓋的方法
    Father p = new Child();
}