Cache DawnException and use it for buffer map failures

Bug: b/452516879, b/344805524
Change-Id: I1f1b84ca130e962fcf7f706582c0b9051fd2c9e5
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/337035
Reviewed-by: Nikita Gupta <nikigupta@google.com>
Reviewed-by: Mridul Goyal <mridulgoyal@google.com>
Commit-Queue: Tarun Saini <sainitarun@google.com>
diff --git a/generator/templates/art/JNIClasses.cpp b/generator/templates/art/JNIClasses.cpp
index b78bad3..9c45a63 100644
--- a/generator/templates/art/JNIClasses.cpp
+++ b/generator/templates/art/JNIClasses.cpp
@@ -43,6 +43,7 @@
     gpuCallbackRunnable = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("androidx/webgpu/GPURequestCallbackRunnable")));
     gpuCallbackErrorTypeRunnable = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("androidx/webgpu/GPURequestCallbackErrorTypeRunnable")));
     gpuCallbackVoidRunnable = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("androidx/webgpu/GPURequestCallbackVoidRunnable")));
+    dawnException = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("androidx/webgpu/DawnException")));
     stringClass = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("java/lang/String")));
     gpuHardwareBufferExternalTexture = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("androidx/webgpu/GPUHardwareBufferExternalTexture")));
     gpuHardwareBufferTexture = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("androidx/webgpu/GPUHardwareBufferTexture")));
diff --git a/generator/templates/art/JNIClasses.h b/generator/templates/art/JNIClasses.h
index ebf6721..22fa67f 100644
--- a/generator/templates/art/JNIClasses.h
+++ b/generator/templates/art/JNIClasses.h
@@ -45,6 +45,7 @@
         jclass gpuCallbackRunnable;
         jclass gpuCallbackErrorTypeRunnable;
         jclass gpuCallbackVoidRunnable;
+        jclass dawnException;
         jclass stringClass;
         jclass gpuHardwareBufferExternalTexture;
         jclass gpuHardwareBufferTexture;
diff --git a/generator/templates/art/methods.cpp b/generator/templates/art/methods.cpp
index bad5f08..2831ad1 100644
--- a/generator/templates/art/methods.cpp
+++ b/generator/templates/art/methods.cpp
@@ -45,8 +45,8 @@
 
 jobject toByteBuffer(JNIEnv *env, const void* address, jlong size) {
     if (!address) {
-      //* TODO(b/344805524): custom exception for Dawn.
-      env->ThrowNew(env->FindClass("java/lang/Error"), "Invalid byte buffer.");
+      JNIClasses* classes = JNIClasses::getInstance(env);
+      env->ThrowNew(classes->dawnException, "Invalid byte buffer.");
       return nullptr;
     }
     jclass byteBufferClass = env->FindClass("java/nio/ByteBuffer");
diff --git a/tools/android/webgpu/src/androidTest/java/androidx/webgpu/BufferTest.kt b/tools/android/webgpu/src/androidTest/java/androidx/webgpu/BufferTest.kt
index 91c6d8e..9308d0c 100644
--- a/tools/android/webgpu/src/androidTest/java/androidx/webgpu/BufferTest.kt
+++ b/tools/android/webgpu/src/androidTest/java/androidx/webgpu/BufferTest.kt
@@ -97,8 +97,7 @@
   fun bufferMapFailureTest() {
     runBlocking {
       val unused = webGpu.execute {
-        //TODO(b/452516879): Catch a more specific exception type.
-        assertThrows(Error::class.java) {
+        assertThrows(DawnException::class.java) {
           device.createBuffer(
             GPUBufferDescriptor(
               usage = BufferUsage.Vertex,
@@ -252,9 +251,8 @@
 
         assertEquals(BufferMapState.Unmapped, buffer.mapState)
 
-        //TODO(b/452516879): Catch a more specific exception type.
         // Should not be able to get the mapped range after unmapping.
-        assertThrows(Error::class.java) {
+        assertThrows(DawnException::class.java) {
           buffer.getMappedRange(0, bufferSize)
         }
       }