实现文件
// // Created by Peng Cai on 2018/10/16. //
# include "include/call_super.h"
# include
# include
# include
JNIEXPORT void JNICALL Java_org_professor_jni_MainActivity_callNativeSuperInstanceMethod(JNIEnv *env, jobject instance) {
    //1. 获取类类型
    jclass birdClazz = (*env)->FindClass(env, "org/professor/jni/animal/Bird");
    if (NULL == birdClazz) {
        __android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Bird Class Failed");
        return;
    }
    //2.获取构造函数ID 构造方法的名统一为:<init>
    jmethodID birdInstanceMethodId = (*env)->GetMethodID(env, birdClazz, "<init>",
                                                         "(Ljava/long/String;)V");
    if (NULL == birdInstanceMethodId) {
        __android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Bird Instance Method Id Failed");
        return;
    }
    //3. 创建一个对象实例
    jstring name = (*env)->NewStringUTF(env, "YIMI");
    if (NULL == name) {
        //有可能内存不够
        __android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Bird Name Failed");
        return;
    }
    jobject birdObj = (*env)->NewObject(env, birdClazz, birdInstanceMethodId, name);
    if (NULL == birdObj) {
        __android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Bird Instance Obj Failed");
        return;
    }
    // 4.获取调用方法ID
    jmethodID birdGetNameMethodID = (*env)->GetMethodID(env, birdClazz, "getName",
                                                        "()Ljava/long/String;");
    if (NULL == birdGetNameMethodID) {
        __android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Bird Get Name Method Id Failed");
        return;
    }
    //5. 调用自己getName方法
    jstring birdName = (*env)->CallObjectMethod(env, birdObj, birdGetNameMethodID);
    if (NULL != birdName) {
        const char *c_bird_name = (*env)->GetStringUTFChars(env, birdName,
                                                            JNI_FALSE); //转换编码格式 在C里面用 JNI_FALSE代表不拷贝到缓冲区
        if (NULL != c_bird_name) {
            __android_log_print(ANDROID_LOG_WARN, "ANIMAL bird name = %s", c_bird_name);
            //释放从java层获取到的字符串所分配的内存
            (*env)->ReleaseStringUTFChars(env, birdName, c_bird_name);
        }
    }
    //-------华丽分割线--------------
    //6. 获取父类的Clazz
    jclass animalClazz = (*env)->FindClass(env, "org/professor/jni/Animal");
    if (NULL == animalClazz) {
        __android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Animal Class Failed");
        return;
    }
    //7.获取父类方法ID eat方法
    jmethodID animalEatMethodID = (*env)->GetMethodID(env, animalClazz, "eat", "()V");
    if (NULL == animalEatMethodID) {
        __android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Animal Eat Method Id Failed");
        return;
    }
    //8.子类调用父类方法 eat
    //注意:birdObj是Bird的实例,animalClazz是Animal的Class引用,animalEatMethodID是Animal类中的方法ID
    (*env)->CallNonvirtualVoidMethod(env, birdObj, animalClazz, animalEatMethodID);
    //--------------华丽分割线------------------
    // 9.获取父类调用方法getName
    jmethodID animalGetNameMethodID = (*env)->GetMethodID(env, animalClazz, "getName",
                                                          "()Ljava/long/String;");
    if (NULL == animalGetNameMethodID) {
        __android_log_print(ANDROID_LOG_WARN, "ANIMAL", "Create Animal Get Name Method Id Failed");
        return;
    }
    //10.子类调用父类GetName 方法
    jstring animalName = (*env)->CallNonvirtualObjectMethod(env, birdObj, animalClazz,
                                                            animalGetNameMethodID);
    if (NULL != animalName) {
        const char *c_animal_name = (*env)->GetStringUTFChars(env, animalName, JNI_FALSE);
        if (NULL != c_animal_name) {
            __android_log_print(ANDROID_LOG_WARN, "ANIMAL animal name = %s",
                                c_animal_name);
            //释放从java层获取到的字符串所分配的内存
            (*env)->ReleaseStringUTFChars(env, animalName, c_animal_name);
        }
    }
    quit:
    // 删除局部引用变量 jmethod 不是引用类型 (jobject或jobject的子类才属于引用变量)
    (*env)->DeleteLocalRef(env, birdClazz);
    (*env)->DeleteLocalRef(env, animalClazz);
    (*env)->DeleteLocalRef(env, name);
    (*env)->DeleteLocalRef(env, birdObj);
    (*env)->DeleteLocalRef(env, birdName);
    (*env)->DeleteLocalRef(env, animalName);
} ```