当前位置: 首页 > 后端技术 > Java

JNI:获取Java属性和设置Java属性值

时间:2023-04-02 10:38:32 Java

1.获取Java属性/设置Java属性值获取对应属性的jfieldID后,可以使用SetFieldGetFieldSetStaticFieldGetStaticField等函数对Java属性进行操作。类实例方法set/getBooleanfieldset/getByTeFieldSet/getDoubleFieldSet/getfloatfieldset/getIntfieldset/getlongfieldset/getlongfieldset/getShortfieldset/getShortfieldfieldfieldfield/getstaticbooleanfieldsetingetStaticBooleanfieldset/getStaticbytebytebytebyte/getStaticdouffield/getStaticfield/getStaticiffeitfifte怎样获取数组类型的属性。不过JNI提供了一系列的方法来获取数组的属性,后面会介绍。2.Case修改C/C++包中Java中的属性com.omg;publicclassTestNative{publicintnumber;publicnativevoidsayHello();}C++代码jclassclazz_TestNative=env->GetObjectClass(obj);jfieldIDid_number=env->GetFieldID(clazz_TestNative,"number","I");jintnumber=env->GetIntFiled(obj,id_number);count<SetIntField(obj,id_number,100L);3。Java方法调用JNIEnv提供了众多的CallMethod和CallStaticMethod,以及CallNonvirtualMethod函数。需要通过GetMethodID获取对应方法的jmethodID,传入上述函数的参数中。调用实例方法的三种形式CallMethod(jobjectobj,jmethodIDid,...);CallMethodV(jobjectobj,jmethodIDid,va_??listlst);CallMethodA(jobjectobj,jmethodIDid,j值*v);第一个是最常用的方法,第二个是调用这个函数的时候,有一个指向参数表的va_list变量(不常用)第三个是调用这个函数的时候,有一个jvalue或者jvalue数组的指针,使用调用静态方法的三种形式,jmethodIDid,jvalue*v);伪代码java:publicbooleanfunction(inti,doubled,charc){//...}Cenv->CallBooleanMethod(obj,id_function,100L,1.11,L'3')jvalue*args=newjvalue[3];args[0].i=100L;args[1].d=3.44;args[2].c=L'3';env->CallBooleanMethod(obj,id_function,args);删除[]参数;4。案例在C/C++中替换Java中的方法Java代码包com.omg;publicclassTestNative{publicmax(doublenum1,doublenum2){returnnum1>num2?num1:num2;}}C++代码jclassclazz_TestNative=env->GetObjectClass(obj);jmethodIDid_max=env->GetMetodID(clazz_TestNative,obj,"(DD)D");jdoublemaxVal=env->GetDoubleMethod(obj,id_max,2.1,3.14);cout<<最大值<<结束;5.CallNonvirtual方法有如下Java代码publicclassFather{publicvoidfunction(){System.out.println("Fatherfunction");}}publicclassChildextendsFather{publicvoidfunction(){System.out.println("子函数");}}想想这段Java代码调用了哪个类的方法?父亲p=newChild();p.function();如果要调用父类的函数,那是没有办法的。有如下C++代码classFather{public:voidfunction(){cout<<"Fatherfunction"<function();C++有虚函数的概念,修改父类,增加一个virtualclassFather{public:virtualvoidfunction(){cout<<"父函数"<函数();在Java语言中,所有的函数都是虚函数,可以通过在JNI中定义CallNonvirtual方法来实现子类对象调用父类方法的函数。如果想调用一个对象的父类的方法而不是子类的overwrite方法,可以使用CallNonVirtual方法使用CallNonVirtual方法,首先获取父类的jmethodID和方法要调用的父类然后传给这个函数通过子类对象调用被覆盖的父类的方法5.casepackagecom.omg;publicclassFather{publicvoidfunction(){System.out.println("Fatherfunction");}}packagecom.omg;publicclassChildextendsFather{publicvoidfunction(){System.out.println("子函数");}}测试Java定义成员变量publicFatherp=newChild();C++代码jclassclazz_TestNative=env->GetObjectClass(obj);jfieldIDid_p=env->GetFieldID(clazz_TestNative,"p","Lcom/omg/Father;");jobjectp=env->GetObjectField(obj,id_p);jclassclazz_Father=env->FindClass("Lcom/omg/Father;");jmethodIDid_Father_function=env->GetMethodID(clazz_Father,"函数","()V");env->CallVoidMethod(p,id_Father_function);env->CallNonvirtualVoidMethod(p,clazz_Father,id_Father_function);

最新推荐
猜你喜欢