Cómo pasar parámetros en la programación JNI (2): pasar tipos de matriz
Veamos un ejemplo de cómo pasar una matriz int. El programa Java no se escribirá JNIEXPORT jintJNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr) { jint *carr = env->. GetIntArrayElements(arr, false); if(carr == NULL) { return 0; /* ocurrió una excepción */ } jint sum = 0 for(int i=0; iReleaseIntArrayElements(arr, carr, 0); return sum; } En este ejemplo, las funciones GetIntArrayElements y ReleaseIntArrayElements son funciones proporcionadas por JNI para procesar matrices int. Si intenta acceder al tipo jintArray usando arr[i], indudablemente habrá un error. JNI también proporciona otro par de funciones GetIntArrayRegion y ReleaseIntArrayRegion. Para acceder a int arrays., no lo presentaré. Para otros tipos básicos de matrices, el método es similar en JNI, las matrices bidimensionales y las matrices de cadenas se consideran matrices de objetos, porque las matrices y las cadenas todavía se consideran objetos. Un ejemplo para ilustrar, esta vez es una matriz int bidimensional, como valor de retorno JNIEXPORTjobjectArray JNICALL Java_ObjectArrayTest_initInt2DArray(JNIEnv *env, jclasscls, int size) { jobjectArray result; resultado = env->NewObjectArray(size, intArrCls, NULL); for (int i = 0; i < size; i++) { jint tmp[256] /* ¡asegúrate de que sea lo suficientemente grande */ jintArray iarr = env-! > NewIntArray(tamaño); for(int j = 0; j < tamaño; j++) { tmp[j] = i + j } env->SetIntArrayRegion(iarr, 0, tamaño, tmp); , i, iarr); env->DeleteLocalRef(iarr); } return result; }La tercera línea del código anterior, jobjectArray result; debido a que desea devolver un valor, debe crear un nuevo objeto jobjectArray. jclass intArrCls = env->FindClass("[I"); crea una referencia a jclass. Debido a que los elementos del resultado son referencias a matrices int unidimensionales, intArrCls deben ser referencias a matrices int unidimensionales. ¿Paño de lana? Preste atención al parámetro "[I" de FindClass, que JNI utiliza para determinar el tipo de referencia. I representa el tipo int y el [identificador es una matriz.
Para otros tipos, existen métodos de representación correspondientes. Z booleanB byteC charS shortI intJ longF floatD doubleString está representado por "Ljava/lang/String;". En consecuencia, la matriz de cadenas debe ser "[Ljava/lang/String;". Volviendo al código, result = env->NewObjectArray(size, intArrCls, NULL) se usa para asignar espacio para el resultado.