JNI编程之如何传递参数(二)——数组类型的传递

如题所述

来看一个传递int数组的例子,Java程序就不写了,JNIEXPORT jintJNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr) { jint *carr; carr = env->GetIntArrayElements(arr, false); if(carr == NULL) { return 0; /* exception occurred */ } jint sum = 0; for(int i=0; iReleaseIntArrayElements(arr, carr, 0); return sum; }这个例子中的GetIntArrayElements和ReleaseIntArrayElements函数就是JNI提供用于处理int数组的函 数。如果试图用arr[i]的方式去访问jintArray类型,毫无疑问会出错。JNI还提供了另一对函数GetIntArrayRegion和 ReleaseIntArrayRegion访问int数组,就不介绍了,对于其他基本类型的数组,方法类似。二维数组和String数组在JNI中,二维数组和String数组都被视为object数组,因为数组和String被视为object。仍然用一个例子来说明,这次是一个二维int数组,作为返回值。JNIEXPORTjobjectArray JNICALL Java_ObjectArrayTest_initInt2DArray(JNIEnv *env, jclasscls, int size) { jobjectArray result; jclass intArrCls = env->FindClass("[I"); result = env->NewObjectArray(size, intArrCls, NULL); for (int i = 0; i < size; i++) { jint tmp[256]; /* make sure it is large enough! */ jintArray iarr = env->NewIntArray(size); for(int j = 0; j < size; j++) { tmp[j] = i + j; } env->SetIntArrayRegion(iarr, 0, size, tmp); env->SetObjectArrayElement(result, i, iarr); env->DeleteLocalRef(iarr); } return result; }上面代码中的第三行,jobjectArray result;因为要返回值,所以需要新建一个jobjectArray对象。jclass intArrCls = env->FindClass("[I");是创建一个jclass的引用,因为result的元素是一维int数组的引用,所以intArrCls必须是一维int数组的引用,这一点是如何保证的 呢?注意FindClass的参数"[I",JNI就是通过它来确定引用的类型的,I表示是int类型,[标识是数组。对于其他的类型,都有相应的表示方 法,Z booleanB byteC charS shortI intJ longF floatD doubleString是通过“Ljava/lang/String;”表示的,那相应的,String数组就应该是“[Ljava/lang/String;”。还是回到代码,result = env->NewObjectArray(size, intArrCls, NULL);的作用是为result分配空间。
温馨提示:答案为网友推荐,仅供参考
相似回答