对二维数组的处理是建立在一维数组之上的
我的观念还是优先考虑java数组和c++数组的转换,不直接从java数组中取数据进行操作
FindClass这个方法主要是获取jclass的,所谓的二维数组就是jobjectarray里放着jxxxarray的一维数组,这样理解就好多了,关键是获取到相应的一维数组进行操作
Get\SetxxxxArrayElement直接获取某个数组里的元素
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直接获取数组的指针
releasexxxArrayElemets释放指针
这是一对操作