am 9deecdc8: am fc45b664: am f0aa4cc0: am a4898534: Merge "Fix improper use of JNI_ABORT for operations where Java objects are written."
* commit '9deecdc88f77d8a4a8ff25c1ef2405b42a05ce81': Fix improper use of JNI_ABORT for operations where Java objects are written.
This commit is contained in:
@@ -47,24 +47,29 @@
|
||||
|
||||
using namespace android;
|
||||
|
||||
#define PER_ARRAY_TYPE(flag, fnc, ...) { \
|
||||
#define PER_ARRAY_TYPE(flag, fnc, readonly, ...) { \
|
||||
jint len = 0; \
|
||||
void *ptr = NULL; \
|
||||
size_t typeBytes = 0; \
|
||||
jint relFlag = 0; \
|
||||
if (readonly) { \
|
||||
/* The on-release mode should only be JNI_ABORT for read-only accesses. */ \
|
||||
relFlag = JNI_ABORT; \
|
||||
} \
|
||||
switch(dataType) { \
|
||||
case RS_TYPE_FLOAT_32: \
|
||||
len = _env->GetArrayLength((jfloatArray)data); \
|
||||
ptr = _env->GetFloatArrayElements((jfloatArray)data, flag); \
|
||||
typeBytes = 4; \
|
||||
fnc(__VA_ARGS__); \
|
||||
_env->ReleaseFloatArrayElements((jfloatArray)data, (jfloat *)ptr, JNI_ABORT); \
|
||||
_env->ReleaseFloatArrayElements((jfloatArray)data, (jfloat *)ptr, relFlag); \
|
||||
return; \
|
||||
case RS_TYPE_FLOAT_64: \
|
||||
len = _env->GetArrayLength((jdoubleArray)data); \
|
||||
ptr = _env->GetDoubleArrayElements((jdoubleArray)data, flag); \
|
||||
typeBytes = 8; \
|
||||
fnc(__VA_ARGS__); \
|
||||
_env->ReleaseDoubleArrayElements((jdoubleArray)data, (jdouble *)ptr, JNI_ABORT);\
|
||||
_env->ReleaseDoubleArrayElements((jdoubleArray)data, (jdouble *)ptr, relFlag); \
|
||||
return; \
|
||||
case RS_TYPE_SIGNED_8: \
|
||||
case RS_TYPE_UNSIGNED_8: \
|
||||
@@ -72,7 +77,7 @@ using namespace android;
|
||||
ptr = _env->GetByteArrayElements((jbyteArray)data, flag); \
|
||||
typeBytes = 1; \
|
||||
fnc(__VA_ARGS__); \
|
||||
_env->ReleaseByteArrayElements((jbyteArray)data, (jbyte*)ptr, JNI_ABORT); \
|
||||
_env->ReleaseByteArrayElements((jbyteArray)data, (jbyte*)ptr, relFlag); \
|
||||
return; \
|
||||
case RS_TYPE_SIGNED_16: \
|
||||
case RS_TYPE_UNSIGNED_16: \
|
||||
@@ -80,7 +85,7 @@ using namespace android;
|
||||
ptr = _env->GetShortArrayElements((jshortArray)data, flag); \
|
||||
typeBytes = 2; \
|
||||
fnc(__VA_ARGS__); \
|
||||
_env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, JNI_ABORT); \
|
||||
_env->ReleaseShortArrayElements((jshortArray)data, (jshort *)ptr, relFlag); \
|
||||
return; \
|
||||
case RS_TYPE_SIGNED_32: \
|
||||
case RS_TYPE_UNSIGNED_32: \
|
||||
@@ -88,7 +93,7 @@ using namespace android;
|
||||
ptr = _env->GetIntArrayElements((jintArray)data, flag); \
|
||||
typeBytes = 4; \
|
||||
fnc(__VA_ARGS__); \
|
||||
_env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, JNI_ABORT); \
|
||||
_env->ReleaseIntArrayElements((jintArray)data, (jint *)ptr, relFlag); \
|
||||
return; \
|
||||
case RS_TYPE_SIGNED_64: \
|
||||
case RS_TYPE_UNSIGNED_64: \
|
||||
@@ -96,7 +101,7 @@ using namespace android;
|
||||
ptr = _env->GetLongArrayElements((jlongArray)data, flag); \
|
||||
typeBytes = 8; \
|
||||
fnc(__VA_ARGS__); \
|
||||
_env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, JNI_ABORT); \
|
||||
_env->ReleaseLongArrayElements((jlongArray)data, (jlong *)ptr, relFlag); \
|
||||
return; \
|
||||
default: \
|
||||
break; \
|
||||
@@ -672,6 +677,7 @@ static void ReleaseBitmapCallback(void *bmp)
|
||||
}
|
||||
|
||||
|
||||
// Copies from the Java object data into the Allocation pointed to by _alloc.
|
||||
static void
|
||||
nAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
|
||||
jint count, jobject data, jint sizeBytes, jint dataType)
|
||||
@@ -679,9 +685,10 @@ nAllocationData1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint off
|
||||
RsAllocation *alloc = (RsAllocation *)_alloc;
|
||||
LOG_API("nAllocation1DData, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), dataType(%i)",
|
||||
(RsContext)con, (RsAllocation)alloc, offset, count, sizeBytes, dataType);
|
||||
PER_ARRAY_TYPE(NULL, rsAllocation1DData, (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
|
||||
PER_ARRAY_TYPE(NULL, rsAllocation1DData, true, (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
|
||||
}
|
||||
|
||||
// Copies from the Java array data into the Allocation pointed to by alloc.
|
||||
static void
|
||||
// native void rsnAllocationElementData1D(long con, long id, int xoff, int compIdx, byte[] d, int sizeBytes);
|
||||
nAllocationElementData1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, jint offset, jint lod, jint compIdx, jbyteArray data, jint sizeBytes)
|
||||
@@ -693,6 +700,7 @@ nAllocationElementData1D(JNIEnv *_env, jobject _this, jlong con, jlong alloc, ji
|
||||
_env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
|
||||
}
|
||||
|
||||
// Copies from the Java object data into the Allocation pointed to by _alloc.
|
||||
static void
|
||||
nAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
|
||||
jint w, jint h, jobject data, jint sizeBytes, jint dataType)
|
||||
@@ -701,9 +709,11 @@ nAllocationData2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xof
|
||||
RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
|
||||
LOG_API("nAllocation2DData, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) type(%i)",
|
||||
(RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
|
||||
PER_ARRAY_TYPE(NULL, rsAllocation2DData, (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
|
||||
PER_ARRAY_TYPE(NULL, rsAllocation2DData, true, (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
|
||||
}
|
||||
|
||||
// Copies from the Allocation pointed to by srcAlloc into the Allocation
|
||||
// pointed to by dstAlloc.
|
||||
static void
|
||||
nAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con,
|
||||
jlong dstAlloc, jint dstXoff, jint dstYoff,
|
||||
@@ -728,6 +738,7 @@ nAllocationData2D_alloc(JNIEnv *_env, jobject _this, jlong con,
|
||||
srcMip, srcFace);
|
||||
}
|
||||
|
||||
// Copies from the Java object data into the Allocation pointed to by _alloc.
|
||||
static void
|
||||
nAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint zoff, jint lod,
|
||||
jint w, jint h, jint d, jobject data, int sizeBytes, int dataType)
|
||||
@@ -735,9 +746,11 @@ nAllocationData3D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xof
|
||||
RsAllocation *alloc = (RsAllocation *)_alloc;
|
||||
LOG_API("nAllocation3DData, con(%p), alloc(%p), xoff(%i), yoff(%i), zoff(%i), lod(%i), w(%i), h(%i), d(%i), sizeBytes(%i)",
|
||||
(RsContext)con, (RsAllocation)alloc, xoff, yoff, zoff, lod, w, h, d, sizeBytes);
|
||||
PER_ARRAY_TYPE(NULL, rsAllocation3DData, (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
|
||||
PER_ARRAY_TYPE(NULL, rsAllocation3DData, true, (RsContext)con, alloc, xoff, yoff, zoff, lod, w, h, d, ptr, sizeBytes, 0);
|
||||
}
|
||||
|
||||
// Copies from the Allocation pointed to by srcAlloc into the Allocation
|
||||
// pointed to by dstAlloc.
|
||||
static void
|
||||
nAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con,
|
||||
jlong dstAlloc, jint dstXoff, jint dstYoff, jint dstZoff,
|
||||
@@ -761,14 +774,16 @@ nAllocationData3D_alloc(JNIEnv *_env, jobject _this, jlong con,
|
||||
}
|
||||
|
||||
|
||||
// Copies from the Allocation pointed to by _alloc into the Java object data.
|
||||
static void
|
||||
nAllocationRead(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jobject data, int dataType)
|
||||
{
|
||||
RsAllocation *alloc = (RsAllocation *)_alloc;
|
||||
LOG_API("nAllocationRead, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
|
||||
PER_ARRAY_TYPE(0, rsAllocationRead, (RsContext)con, alloc, ptr, len * typeBytes);
|
||||
PER_ARRAY_TYPE(0, rsAllocationRead, false, (RsContext)con, alloc, ptr, len * typeBytes);
|
||||
}
|
||||
|
||||
// Copies from the Allocation pointed to by _alloc into the Java object data.
|
||||
static void
|
||||
nAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint offset, jint lod,
|
||||
jint count, jobject data, int sizeBytes, int dataType)
|
||||
@@ -776,9 +791,10 @@ nAllocationRead1D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint off
|
||||
RsAllocation *alloc = (RsAllocation *)_alloc;
|
||||
LOG_API("nAllocation1DRead, con(%p), adapter(%p), offset(%i), count(%i), sizeBytes(%i), dataType(%i)",
|
||||
(RsContext)con, alloc, offset, count, sizeBytes, dataType);
|
||||
PER_ARRAY_TYPE(0, rsAllocation1DRead, (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
|
||||
PER_ARRAY_TYPE(0, rsAllocation1DRead, false, (RsContext)con, alloc, offset, lod, count, ptr, sizeBytes);
|
||||
}
|
||||
|
||||
// Copies from the Allocation pointed to by _alloc into the Java object data.
|
||||
static void
|
||||
nAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xoff, jint yoff, jint lod, jint _face,
|
||||
jint w, jint h, jobject data, int sizeBytes, int dataType)
|
||||
@@ -787,7 +803,7 @@ nAllocationRead2D(JNIEnv *_env, jobject _this, jlong con, jlong _alloc, jint xof
|
||||
RsAllocationCubemapFace face = (RsAllocationCubemapFace)_face;
|
||||
LOG_API("nAllocation2DRead, con(%p), adapter(%p), xoff(%i), yoff(%i), w(%i), h(%i), len(%i) type(%i)",
|
||||
(RsContext)con, alloc, xoff, yoff, w, h, sizeBytes, dataType);
|
||||
PER_ARRAY_TYPE(0, rsAllocation2DRead, (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
|
||||
PER_ARRAY_TYPE(0, rsAllocation2DRead, false, (RsContext)con, alloc, xoff, yoff, lod, face, w, h, ptr, sizeBytes, 0);
|
||||
}
|
||||
|
||||
static jlong
|
||||
@@ -1023,7 +1039,7 @@ nScriptGetVarV(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
|
||||
jint len = _env->GetArrayLength(data);
|
||||
jbyte *ptr = _env->GetByteArrayElements(data, NULL);
|
||||
rsScriptGetVarV((RsContext)con, (RsScript)script, slot, ptr, len);
|
||||
_env->ReleaseByteArrayElements(data, ptr, JNI_ABORT);
|
||||
_env->ReleaseByteArrayElements(data, ptr, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
Reference in New Issue
Block a user