JNI中的Array创建与C++回调Java方法

来源:互联网 发布:微软软件license模式 编辑:程序博客网 时间:2024/05/18 16:55

比如需要调用setRecResult方法来给labels和confidences两个数组进行赋值,如下:

    private int[] labels;    private double[] confidences;    public void setRecResult(int[] labels,double[] confideces){        this.labels = labels;        this.confidences = confideces;    }    private native void test();

在JNI层,创建并初始化Array,然后进行回调:

/* * Class:     com_pax_cvandroid_FaceDetect * Method:    test * Signature: ()V */JNIEXPORT void JNICALL Java_com_pax_cvandroid_FaceDetect_test  (JNIEnv *jenv, jobject thiz){    int size = 5;    /**     * create array     */    jintArray jlabelArr = jenv->NewIntArray(size);    jint *labelArr = jenv->GetIntArrayElements(jlabelArr,NULL);    jdoubleArray jconfidencesArr = jenv->NewDoubleArray(size);    jdouble *confidencesArr = jenv->GetDoubleArrayElements(jconfidencesArr,NULL);    /**     * init array     */    int label = -1;    double confidence = 0.1f;    for(int i = 0;i<size;i++){        labelArr[i] = i;        confidencesArr[i] = confidence;    }    /**     * release the array     */    jenv->ReleaseIntArrayElements(jlabelArr,labelArr,0);    jenv->ReleaseDoubleArrayElements(jconfidencesArr,confidencesArr,0);    /**     * call the java method     */    jclass faceDetectClass = jenv->GetObjectClass(thiz);    jmethodID methodId = jenv->GetMethodID(faceDetectClass,"setRecResult","([I[D)V");    jenv->CallVoidMethod(thiz,methodId,jlabelArr,jconfidencesArr);}

GetMethodID方法:

    jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)    { return functions->GetMethodID(this, clazz, name, sig); }

这里写图片描述

如果不知道第三个参数怎么设置,这里有个很方便的做法就是,在java代码中声明一个本地方法(这个本地方法中的参数跟回调方法中的参数一模一样的)
如下:

private native void testSignature(int[] labels,double[] confidences);

利用javah自动生成头文件:

javah -d ../jni -jni com.pax.cvandroid.FaceDetect

然后看下对应的头文件如下:

这里写图片描述

0 0
原创粉丝点击