當前位置:編程學習大全網 - 源碼下載 - JNI編程之如何傳遞參數(二)——數組類型的傳遞

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分配空間。

  • 上一篇:跪求S40操作系統JAVA的GBA模擬器!
  • 下一篇:什麽是亂碼?
  • copyright 2024編程學習大全網