简介:
使用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循环赋值即可。