jni對二維數組的處理

對二維數組的處理是創建在一維數組之上的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

相關文章
相關標籤/搜索