JNI中的回调函数,C++中的vector数组和Java中int数组的转换

时间:2025-03-15 12:35:08

简介:

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


相关文章