获取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;
}