简介:
使用JNI的过程中,在Java端使用C++程序中的回调函数,对程序来说很方便,最近在做图形识别的过程中遇到了数组的转换方面的问题,后来仔细想了一下,在网上简单看了点资料,发现在JNI层对vector数组转换,最后在回调中返回到Java端int数组很有规律,不多说,上代码。
//一维数组
int callbackMethod(int num,vector<int> vArray) { int ret = 0; int needsDetach; JNIEnv *env = getJNIEnv(&needsDetach); jintArray jArray = env->NewIntArray(num); jint *jnum = new jint[num]; for(int i = 0; i < num; ++i) { *(jnum + i) = vArray[i]; } env->SetIntArrayRegion(jArray, 0, num, jnum);//现在得到了我们要的jArray,也就是回调函数中返回到Java端的int数组,回调中的参数为(int a,int[] b);JNI中的类型为"I[I" env->CallVoidMethod(mobj, mid, num,jArray);
jthrowable exception = env->ExceptionOccurred(); if (exception) { env->ExceptionDescribe(); ret = -1; } delete[] jnum; return ret; }
//二维数组
int callbackMethod(int num, vector<vector<int> > vArray) { int ret = 0; int needsDetach; JNIEnv *env = getJNIEnv(&needsDetach); jobjectArray jOArray;
jclass intArrCls = env->FindClass("[I"); jOArray = env->NewObjectArray(num, intArrCls, 0);
//二维数组长度为2,循环赋值
for (int i = 0; i < num; i++) { jint tmp[2]; jintArray jiarr = env->NewIntArray(2); for(int j = 0; j < 2; j++) { tmp[j] = vArray[i][j]; } env->SetIntArrayRegion(jiarr, 0, 2, tmp); env->SetObjectArrayElement(jOArray, i, jiarr); env->DeleteLocalRef(jiarr); }
//回调中的参数为(int a,int[] b);JNI中的类型为"I[[I" env->CallVoidMethod(mobj, mid, num, jOArray); jthrowable exception = env->ExceptionOccurred(); if (exception) { env->ExceptionDescribe(); ret = -1; } return ret; }
三维数组之类的同理,加一层for循环赋值即可。