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);
网友评论