美文网首页
四、Jni开发:C语言访问JAVA构造方法、父类方法

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

作者: re冷星 | 来源:发表于2016-08-20 22:27 被阅读108次

    这篇文章主要介绍了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, "<init>", "()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构造方法、父类方法

          本文链接:https://www.haomeiwen.com/subject/mqcisttx.html