From 5ea77d8b771bf7b0be7acc7fb70c255f8c9c8f77 Mon Sep 17 00:00:00 2001 From: DRC Date: Fri, 26 Oct 2018 08:55:22 -0500 Subject: [PATCH] Android: Fix "using JNI after critical get" error We shouldn't be making JNI calls between GetPrimitiveArrayCritical() and ReleasePrimitiveArrayCritical(). Apparently Android is stricter about this than desktop Java. Issue was introduced in 0713c1bb542672257c08782a5a930a577eb20167. Fixes #300 --- turbojpeg-jni.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/turbojpeg-jni.c b/turbojpeg-jni.c index d0ca37d..d0a0935 100644 --- a/turbojpeg-jni.c +++ b/turbojpeg-jni.c @@ -1,5 +1,5 @@ /* - * Copyright (C)2011-2017 D. R. Commander. All Rights Reserved. + * Copyright (C)2011-2018 D. R. Commander. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -235,11 +235,11 @@ static jint TJCompressor_compress if ((*env)->GetArrayLength(env, dst) < (jsize)jpegSize) _throwarg("Destination buffer is not large enough"); + if (ProcessSystemProperties(env) < 0) goto bailout; + bailif0(srcBuf = (*env)->GetPrimitiveArrayCritical(env, src, 0)); bailif0(jpegBuf = (*env)->GetPrimitiveArrayCritical(env, dst, 0)); - if (ProcessSystemProperties(env) < 0) goto bailout; - if (tjCompress2(handle, &srcBuf[y * actualPitch + x * tjPixelSize[pf]], width, pitch, height, pf, &jpegBuf, &jpegSize, jpegSubsamp, jpegQual, flags | TJFLAG_NOREALLOC) == -1) @@ -341,6 +341,8 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compressFrom if ((*env)->GetArrayLength(env, dst) < (jsize)jpegSize) _throwarg("Destination buffer is not large enough"); + if (ProcessSystemProperties(env) < 0) goto bailout; + bailif0(srcOffsets = (*env)->GetPrimitiveArrayCritical(env, jSrcOffsets, 0)); bailif0(srcStrides = (*env)->GetPrimitiveArrayCritical(env, jSrcStrides, 0)); for (i = 0; i < nc; i++) { @@ -365,8 +367,6 @@ JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compressFrom } bailif0(jpegBuf = (*env)->GetPrimitiveArrayCritical(env, dst, 0)); - if (ProcessSystemProperties(env) < 0) goto bailout; - if (tjCompressFromYUVPlanes(handle, srcPlanes, width, srcStrides, height, subsamp, &jpegBuf, &jpegSize, jpegQual, flags | TJFLAG_NOREALLOC) == -1) -- 2.40.0