From: DRC Date: Fri, 26 Oct 2018 13:55:22 +0000 (-0500) Subject: Android: Fix "using JNI after critical get" error X-Git-Tag: 2.0.1~5 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5ea77d8b771bf7b0be7acc7fb70c255f8c9c8f77;p=libjpeg-turbo 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 --- 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)