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

相关文章
相关标签/搜索