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

来源:互联网 发布:查学校的软件 编辑:程序博客网 时间:2024/06/03 22:05

简介:

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


1 0
原创粉丝点击