Fix "using JNI after critical" exceptions
Refactored ScopedJavaNioBuffer implementation to copy
directly to std::vector<uint8_t> instances and release
the jni critical array queries immediately after copying
into a vector. This is to avoid potential interleavings
of JNI method calls before destructor of ScopedJavaNioBuffer
is invoked. As per jni requirements no other JNI calls are
allowed after GetPrimitiveArrayCritical until a matching call
to ReleasePrimitiveArrayCritical is made.
Fixes: 271468824
Test: Added tests to MeshTest
Change-Id: Ia4afd8b8584ae43f021c79b6a341b05e80e0e205
diff --git a/libs/hwui/Mesh.h b/libs/hwui/Mesh.h
index 9836817..13e3c8e 100644
--- a/libs/hwui/Mesh.h
+++ b/libs/hwui/Mesh.h
@@ -104,33 +104,31 @@
class Mesh {
public:
- Mesh(const sk_sp<SkMeshSpecification>& meshSpec, int mode, const void* vertexBuffer,
- size_t vertexBufferSize, jint vertexCount, jint vertexOffset,
+ Mesh(const sk_sp<SkMeshSpecification>& meshSpec, int mode,
+ std::vector<uint8_t>&& vertexBufferData, jint vertexCount, jint vertexOffset,
std::unique_ptr<MeshUniformBuilder> builder, const SkRect& bounds)
: mMeshSpec(meshSpec)
, mMode(mode)
+ , mVertexBufferData(std::move(vertexBufferData))
, mVertexCount(vertexCount)
, mVertexOffset(vertexOffset)
, mBuilder(std::move(builder))
- , mBounds(bounds) {
- copyToVector(mVertexBufferData, vertexBuffer, vertexBufferSize);
- }
+ , mBounds(bounds) {}
- Mesh(const sk_sp<SkMeshSpecification>& meshSpec, int mode, const void* vertexBuffer,
- size_t vertexBufferSize, jint vertexCount, jint vertexOffset, const void* indexBuffer,
- size_t indexBufferSize, jint indexCount, jint indexOffset,
+ Mesh(const sk_sp<SkMeshSpecification>& meshSpec, int mode,
+ std::vector<uint8_t>&& vertexBufferData, jint vertexCount, jint vertexOffset,
+ std::vector<uint8_t>&& indexBuffer, jint indexCount, jint indexOffset,
std::unique_ptr<MeshUniformBuilder> builder, const SkRect& bounds)
: mMeshSpec(meshSpec)
, mMode(mode)
+ , mVertexBufferData(std::move(vertexBufferData))
, mVertexCount(vertexCount)
, mVertexOffset(vertexOffset)
+ , mIndexBufferData(std::move(indexBuffer))
, mIndexCount(indexCount)
, mIndexOffset(indexOffset)
, mBuilder(std::move(builder))
- , mBounds(bounds) {
- copyToVector(mVertexBufferData, vertexBuffer, vertexBufferSize);
- copyToVector(mIndexBufferData, indexBuffer, indexBufferSize);
- }
+ , mBounds(bounds) {}
Mesh(Mesh&&) = default;
@@ -180,13 +178,6 @@
MeshUniformBuilder* uniformBuilder() { return mBuilder.get(); }
private:
- void copyToVector(std::vector<uint8_t>& dst, const void* src, size_t srcSize) {
- if (src) {
- dst.resize(srcSize);
- memcpy(dst.data(), src, srcSize);
- }
- }
-
sk_sp<SkMeshSpecification> mMeshSpec;
int mMode = 0;