JAVA之JNI小结(二)

2014-11-24 11:20:08 · 作者: · 浏览: 8
class = env->GetObjectClass(obj);//get class object
jfieldID fieldID_prop = env->GetFieldID(java_class,"property","I");//get property id
jmethodID methodID_func = env->GetMethodID(java_class,"function","(ILjava/util/Date;[I)I");//get method id e.g.
//取得Java类中属性property的值
jint number = env->GetIntField(obj,fieldID_prop);
cout << number<
//修改property的值, 改为120
env->SetIntField(obj,fieldID_prop,120L);
//调用java中的方法
jmethodID methodID_max = env->GetMethodID(java_class,"maxValue","(DD)D");//get method ID
jdouble maxValue = env->CallDoubleMethod(obj,methodID_max,3.11,3.15);
cout<< "the maxValue is "<
//调用java继承关系的类, 调用的是子类的func方法. 相当于Father p = nativeAccessJava.p; p.func();
jfieldID id_inst = env->GetFieldID(java_class,"inst","Lcom/jni/Father;");
jobject inst = env->GetObjectField(obj,id_inst);//get Father class obj
jclass class_Father = env->FindClass("com/jni/Father");//get Father class
jmethodID id_Father_func = env->GetMethodID(class_Father,"func","()V");
cout<<"------------默认是virtual, CallVoidMethod-------------"<
env->CallVoidMethod(inst,id_Father_func); //调用子类的方法
cout<<"------------CallNonvirtualVoidMethod-------------"<
env->CallNonvirtualVoidMethod(inst,class_Father,id_Father_func);//调用父类的方法
}
注意:
Java中的int对于C++中的long型,因此要写成100L的形式。
Java中的字符是unicode,占用2个字节,而c++中站一个字节,需要扩宽,因此char就要变成L‘3’型。
关于一些变量的声明等信息,全在jni.h头文件中寻找就行了。
使用JNI的两个弊端:
( 1)、使用JNI后JAVA程序就不能跨平台了.
(2)、Java是强类型的语言,而C++不是,写JNI时必须非常小心。
强类型语言 :
首先我们要声明Java 语言强类型语言的重要性。首先,每个变量有类型,每个表达式有类型,而且每种类型是严格定义的。其次,所有的数值传递,不管是直接的还是通过方法调用经由参数传过去的都要先进行类型相容性的检查。有些语言没有自动强迫进行数据类型相容性的检查或对冲突的类型进行转换的机制。Java 编译器对所有的表达式和参数都要进行类型相容性的检查以保证类型是兼容的。任何类型的不匹配都是错误的,在编译器完成编译以前,错误必须被改正。  如果你有C或C++的背景,一定要记住Java对数据类型兼容性的要求比任何语言都要严格。例如,在C/C++ 中你能把浮点型值赋给一个整数。在Java 中则不能。另外,C语言中,在一个参数和一个自变量之间没有必然的强制的类型检查。在Java 中则有。起初你可能发现Java 的强制类型检查有点繁烦。但是要记住,从长远来说它将帮助你减少程序出错的可能性。