對二維數組的處理是創建在一維數組之上的java
個人觀念仍是優先考慮java數組和c++數組的轉換,不直接從java數組中取數據進行操做c++
FindClass這個方法主要是獲取jclass的,所謂的二維數組就是jobjectarray裏放着jxxxarray的一維數組,這樣理解就好多了,關鍵是獲取到相應的一維數組進行操做數組
Get\SetxxxxArrayElement直接獲取某個數組裏的元素this
public static native int[][] getData(); public static native void showArray(int[][] data);
JNIEXPORT jobjectArray JNICALL Java_JNITest_getData(JNIEnv *env, jclass thisObj){ int data[2][2]={{1,2},{3,4}}; //獲取數組的class jclass intClass = env->FindClass("[I"); //新建object數組,裏面是int[] jobjectArray jdata=env->NewObjectArray(2,intClass,NULL); //賦值 for(int i=0;i<2;i++){ jintArray intdata = env->NewIntArray(2); env->SetIntArrayRegion(intdata,0,2,(jint*)&data[i]); env->SetObjectArrayElement(jdata,i,intdata); } return jdata; } JNIEXPORT void JNICALL Java_JNITest_showArray(JNIEnv *env, jclass thisObj, jobjectArray array){ //獲取數組長度 int len = env->GetArrayLength(array); int data[10][10]; for(int i=0;i<len;i++){ jintArray intdata =(jintArray)env->GetObjectArrayElement(array,i); //賦值 env->GetIntArrayRegion(intdata,0,len,(jint*)&data[i]); } for(int i=0;i<len;i++){ for(int j=0;j<len;j++){ cout<<data[i][j]<<","; } } }
這裏再介紹幾個方法,在特定場合要比先轉換來得快指針
GetxxxArrayElements直接獲取數組的指針code
releasexxxArrayElemets釋放指針get
這是一對操做io