JNI(2) java与c++的参数传递
2013-09-02 00:36
351 查看
所有的本地方法的第一个参数都是指向JNIEnv结构的。这个结构是用来调用JNI函数的。第二个参数jclass的意义,要看方法是不是静态的(static)或者实例(Instance)的。前者,jclass代表一个类对象的引用,而后者是被调用的方法所属对象的引用。
1.返回值和参数类型根据等价约定映射到本地C/C++类型。有些类型,在本地代码中可直接使用,而其他类型只有通过JNI调用操作。
2.JNI通过JNIENV提供的方法操作Java数组。提供两个函数:一个是操作java的简单数据类型数组, 另一个操作对象数组。
存取Java简单类型的数组,使用GetXXXArrayElements函数,XXX代表了数组的类型。这个函数把Java数组看成参数,返回一个指向对应的本地类型的数组的指针。
对数组的存取完成后,要确保调用相应的ReleaseXXXArrayElements函数。
为了使用java对象的数组,使用GetObjectArrayElement函数和SetObjectArrayElement函数,分别去get,set数组的元素。GetArrayLength函数会返回数组的长度。
3.JNI通过JNIENV提供的方法操作Java对象。可以创建对象,get/set静态或实例的field,调用静态或实例的方法。JNI通过ID识别域和方法,进行上面的操作时,ID都是不可缺少的参数。
如果有了一个类的实例,就可以通过方法GetObjectClass得到这个类,如果没有类的实例,可以通过FindClass得到,参数是完整包路径+类名。
得到一个类后,通过NewObject方法可以创建这个类的实例。参数有两个,第一个为之前得到的jclass,第二个为这个类的构造方法的jmethodID。
例子:
1.返回值和参数类型根据等价约定映射到本地C/C++类型。有些类型,在本地代码中可直接使用,而其他类型只有通过JNI调用操作。
Java 类型 | 本地类型 | 描述 |
boolean | jboolean | C/C++8位整型 |
byte | jbyte | C/C++带符号的8位整型 |
char | jchar | C/C++无符号的16位整型 |
short | jshort | C/C++带符号的16位整型 |
int | jint | C/C++带符号的32位整型 |
long | jlong | C/C++带符号的64位整型e |
float | jfloat | C/C++32位浮点型 |
double | jdouble | C/C++64位浮点型 |
Object | jobject | 任何Java对象,或者没有对应java类型的对象 |
Class | jclass | Class对象 |
String | jstring | 字符串对象 |
Object[] | jobjectArray | 任何对象的数组 |
boolean[] | jbooleanArray | 布尔型数组 |
byte[] | jbyteArray | 比特型数组 |
char[] | jcharArray | 字符型数组 |
short[] | jshortArray | 短整型数组 |
int[] | jintArray | 整型数组 |
long[] | jlongArray | 长整型数组 |
float[] | jfloatArray | 浮点型数组 |
double[] | jdoubleArray | 双浮点型数组 |
存取Java简单类型的数组,使用GetXXXArrayElements函数,XXX代表了数组的类型。这个函数把Java数组看成参数,返回一个指向对应的本地类型的数组的指针。
对数组的存取完成后,要确保调用相应的ReleaseXXXArrayElements函数。
为了使用java对象的数组,使用GetObjectArrayElement函数和SetObjectArrayElement函数,分别去get,set数组的元素。GetArrayLength函数会返回数组的长度。
3.JNI通过JNIENV提供的方法操作Java对象。可以创建对象,get/set静态或实例的field,调用静态或实例的方法。JNI通过ID识别域和方法,进行上面的操作时,ID都是不可缺少的参数。
如果有了一个类的实例,就可以通过方法GetObjectClass得到这个类,如果没有类的实例,可以通过FindClass得到,参数是完整包路径+类名。
得到一个类后,通过NewObject方法可以创建这个类的实例。参数有两个,第一个为之前得到的jclass,第二个为这个类的构造方法的jmethodID。
函数 | 描述 |
GetFieldID | 得到一个实例的域的ID |
GetStaticFieldID | 得到一个静态的域的ID |
GetMethodID | 得到一个实例的方法的ID |
GetStaticMethodID | 得到一个静态方法的ID |
JNIEXPORT jobjectArray JNICALL Java_TestJCParam_getStructArray (JNIEnv *env, jobject obj) { jclass objClass = (env)->FindClass("java/lang/Object"); jobjectArray args = (env)->NewObjectArray(5,objClass,0); jclass objectClass = (env)->FindClass("com/DiskInfo"); jfieldID str = (env)->GetFieldID(objectClass,"name","Ljava/lang/String;"); jfieldID id = (env)->GetFieldID(objectClass,"serial","I"); for(int i=0;i<5;i++) { jmethodID jmid = env->GetMethodID(objectClass,"<init>","()V");//得到jclass的构造方法的ID jobject jo = env->NewObject(objectClass, jmid);//创建一个对象 jstring jstr = (env)->NewStringUTF("ni da ye !"); (env)->SetObjectField(jo,str,jstr); (env)->SetIntField(jo,id,i); (env)->SetObjectArrayElement(args,i,jo); } return args; }
相关文章推荐
- Jni中C++和Java的参数传递
- jni java c++ 参数传递问题解决
- Jni 参数传递与操作——(C/C++ 代码与 java 代码的互相调用)
- Chap7:Jni中C++和Java的参数传递
- Jni中C++和Java的参数传递
- Java JNI调用c++ dll文件,传递参数乱码问题
- Jni中C++和Java的参数传递
- Jni中C++和Java的参数传递
- Jni中C++和Java的参数传递
- Jni中C++和Java的参数传递
- Jni中C++和Java的参数传递
- Jni中C++和Java的参数传递
- JAVA C# C/C++之比较学:参数传递
- jni中c++给java传递数组
- JNI+opencv3+.dll+eclipse+vs2015:java调用c++传递String类型参数全过程
- C++参数传递 和 java参数传递的异同
- 浅谈JAVA和C++两者的参数传递
- Android C++向java传递不定长且不同类型的参数
- Java JNI (Java和C++互传ArrayList泛型对象参数)
- Java和C++中的参数传递