Android NDK开发技术小结

154 阅读1分钟

获取Java层数组的值

//连环画滤镜
// 这里使用jintArray来传入java层说的数组
extern "C" JNIEXPORT jintArray JNICALL
Java_com_plbear_imagedemo_jinterface_CvInterface_child(
        JNIEnv *env,
        jobject, jintArray buf, jint w, jint h) {
    jint *cbuf;
    jboolean ptfalse = false;
    // 利用GetIntArrayElements来获取int数组的值
    cbuf = env->GetIntArrayElements(buf, &ptfalse);
    if (cbuf == NULL) {
        return 0;
    }
    Mat imgData(h, w, CV_8UC4, (unsigned char *) cbuf);
    int nr = imgData.rows;
    int channel = imgData.channels();
    int nc = imgData.cols;
    for (int i = 0; i < nr; i++) {
        auto rowData = imgData.ptr<unsigned char>(i);
        for (int j = 0; j < nc; j++) {
            unsigned char *curData = rowData + (j * channel);
            auto blue = curData[0];
            auto green = curData[1];
            auto red = curData[2];
            auto DBlue = abs(1.0 * blue - green + blue + red) * green / 256;
            auto DGreen = abs(1.0 * blue - green + blue + red) * red / 256;
            auto DRed = abs(1.0 * green - blue + green + red) * red / 256;
            curData[0] = (unsigned char) DBlue;
            curData[1] = (unsigned char) DGreen;
            curData[2] = (unsigned char) DRed;
        }
    }
    int size = w * h;
    jintArray result = env->NewIntArray(size);
    // 将数组的值设置到jintArray数组中
    env->SetIntArrayRegion(result, 0, size, (jint *) imgData.data);
    //释放jintArray数组的内存空间
    env->ReleaseIntArrayElements(buf, cbuf, 0);
    return result;
}