Jni调用java方法

作者: 大旺旺的弟弟小旺旺 | 来源:发表于2021-10-17 08:51 被阅读0次

    java调用jni使用native就可以了,但是jni如何调用java方法呢,分为两种方法,第一种传递object进行,第二种使用路径查找类名的方法。
    java和jni参数是拷贝传递,即使在jni哪里删除了,java也是不会有影响的。在jni中创建的对象需要delete,这个也不是必须的,因为在方法结束的时候,就会自己清除掉,但是在c++方便的就是可以在自己不适用的时候就自己把它们清除掉。
    局部引用和java一样 ,出了方法就没有了,全局引用可以解决,、
    弱引用:弱全局引用 ,它不会阻止回收。

    方法一:

        jclass peopleClass  = env->GetObjectClass(people);
    //    括号外是返回指定签名
        jmethodID jSetAge = env->GetMethodID(peopleClass,"setAge", "(I)V");
        jmethodID jGetAge = env->GetMethodID(peopleClass,"getAge", "()I");
        jmethodID jSetName = env->GetMethodID(peopleClass,"setName", "(Ljava/lang/String;)V");
        jmethodID jGetName = env->GetMethodID(peopleClass,"getName", "()Ljava/lang/String;");
        env->CallVoidMethod(people,jSetAge,1);
        jint getVlaue = env->CallIntMethod(people,jGetAge);
        jstring ss = env->NewStringUTF("woshi ");
        env->CallVoidMethod(people,jSetName,ss);
        jobject x = env->CallObjectMethod(people,jGetName);
        //删除局部引用
        env->DeleteLocalRef(x);
        //静态方法
        jmethodID staticValue = env->GetStaticMethodID(peopleClass,"getStaticValue", "()I");
        jint stv = env->CallStaticIntMethod(peopleClass,staticValue);
    

    方法二

        //得到class类的方法2
        jclass stuclass = env->FindClass("com/kangwang/javacallc/bean/Student");
    //    创建对象
    //    构造方法
        jmethodID xx = env->GetMethodID(stuclass,"<init>","()V");
    //    diaoy
        jobject bean2 = env->NewObject(stuclass,xx);
    //    执行方法
        env->CallVoidMethod(bean2,xx);
        jmethodID demo = env->GetStaticMethodID(stuclass,"Demo","()V");
    //    静态
        env->CallStaticVoidMethod(stuclass,demo);
    

    相关文章

      网友评论

        本文标题:Jni调用java方法

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