android ndk学习

Jni调用java方法

2021-10-17  本文已影响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);
上一篇下一篇

猜你喜欢

热点阅读