四、Jni开发:C语言访问JAVA构造方法、父类方法

这篇文章主要介绍了C语言访问JAVA的构造方法、父类方法。

访问构造方法

例子://使用java.util.Date产生一个当前的时间戳

java代码:

    //方法声明
public native Date accessConstructor();

然后在main方法中调用

C代码:
//访问构造方法

    JNIEXPORT jobject JNICALL Java_JniTest_accessConstructor
    (JNIEnv *env, jobject jobj) {
        jclass cls = (*env)->FindClass(env, "java/util/Date");
        //jmethodID
        jmethodID constructor_mid = (*env)->GetMethodID(env, cls, "", "()V");
        //实例化一个Date对象
        jobject date_obj = (*env)->NewObject(env, cls, constructor_mid);
        //调用getTime方法
        jmethodID mid = (*env)->GetMethodID(env, cls, "getTime", "()J");
        jlong time = (*env)->CallLongMethod(env, date_obj, mid);

        printf("\ntime:%lld\n", time);

        return date_obj;
    }
执行结果

访问父类方法

首先新建两个类,Human和Man

Human:

public class Human {
    public void sayHi(){
        System.out.println("人类说你好!!");
    }   
}

Man:

public class Man extends Human{
  @Override
  public void sayHi() {
    System.out.println("男人说你好!!");
  }

  public void sayHi2(){
    super.sayHi();
  }
}

在调用类中创建一个Human类,并用子类来实例化。

public Human human = new Man();

C代码:

//调用父类方法
    JNIEXPORT void JNICALL Java_JniTest_accessNonvirtualMethod
    (JNIEnv *env, jobject jobj) {
        jclass cls = (*env)->GetObjectClass(env, jobj);
        //获取man属性(对象)
        jfieldID fid = (*env)->GetFieldID(env, cls, "human", "LHuman;");
        //获取
        jobject human_obj = (*env)->GetObjectField(env, jobj, fid);

        //执行sayHi方法
        jclass human_cls = (*env)->FindClass(env, "Human"); //注意:传父类的名称
        jmethodID mid = (*env)->GetMethodID(env, human_cls, "sayHi", "()V");

        //执行
        (*env)->CallObjectMethod(env, human_obj, mid);
        //调用的父类的方法
        (*env)->CallNonvirtualObjectMethod(env, human_obj, human_cls, mid);
    }
运行结果

你可能感兴趣的:(四、Jni开发:C语言访问JAVA构造方法、父类方法)