Skip to content

Commit b4c2b53

Browse files
committed
Add useful panic messages on missing classes, methods, fields.
1 parent f5dd05d commit b4c2b53

File tree

1 file changed

+67
-25
lines changed

1 file changed

+67
-25
lines changed

java-spaghetti/src/env.rs

Lines changed: 67 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,9 @@ impl<'env> Env<'env> {
162162
static METHOD_GET_MESSAGE: OnceLock<usize> = OnceLock::new();
163163
let throwable_get_message = *METHOD_GET_MESSAGE.get_or_init(|| {
164164
// use JNI FindClass to avoid infinte recursion.
165-
let throwable_class = self.require_class_jni(c"java/lang/Throwable");
166-
let method = self.require_method(throwable_class, c"getMessage", c"()Ljava/lang/String;");
165+
let class_name = c"java/lang/Throwable";
166+
let throwable_class = self.require_class_jni(class_name);
167+
let method = self.require_method(throwable_class, class_name, c"getMessage", c"()Ljava/lang/String;");
167168
((**self.env).v1_2.DeleteLocalRef)(self.env, throwable_class);
168169
method.addr()
169170
}) as jmethodID; // it is a global ID
@@ -206,8 +207,14 @@ impl<'env> Env<'env> {
206207
let cl_method = *CL_METHOD.get_or_init(|| {
207208
// We still use JNI FindClass for this, to avoid a chicken-and-egg situation.
208209
// If the system class loader cannot find java.lang.ClassLoader, things are pretty broken!
209-
let cl_class = self.require_class_jni(c"java/lang/ClassLoader");
210-
let cl_method = self.require_method(cl_class, c"loadClass", c"(Ljava/lang/String;)Ljava/lang/Class;");
210+
let class_name = c"java/lang/ClassLoader";
211+
let cl_class = self.require_class_jni(class_name);
212+
let cl_method = self.require_method(
213+
cl_class,
214+
class_name,
215+
c"loadClass",
216+
c"(Ljava/lang/String;)Ljava/lang/Class;",
217+
);
211218
((**self.env).v1_2.DeleteLocalRef)(self.env, cl_class);
212219
cl_method.addr()
213220
}) as jmethodID; // it is a global ID
@@ -237,65 +244,100 @@ impl<'env> Env<'env> {
237244

238245
unsafe fn require_class_jni(self, class: &CStr) -> jclass {
239246
let class = ((**self.env).v1_2.FindClass)(self.env, class.as_ptr());
240-
assert!(!class.is_null());
247+
assert!(!class.is_null(), "could not find class {class:?}");
241248
class
242249
}
243250

244-
pub unsafe fn require_method(self, class: jclass, method: &CStr, descriptor: &CStr) -> jmethodID {
251+
pub unsafe fn require_method(
252+
self,
253+
class: jclass,
254+
class_name: &CStr,
255+
method: &CStr,
256+
descriptor: &CStr,
257+
) -> jmethodID {
245258
let method = ((**self.env).v1_2.GetMethodID)(self.env, class, method.as_ptr(), descriptor.as_ptr());
246-
assert!(!method.is_null());
259+
assert!(
260+
!method.is_null(),
261+
"could not find method {method:?} {descriptor:?} on class {class_name:?}"
262+
);
247263
method
248264
}
249265

250-
pub unsafe fn require_static_method(self, class: jclass, method: &CStr, descriptor: &CStr) -> jmethodID {
266+
pub unsafe fn require_static_method(
267+
self,
268+
class: jclass,
269+
class_name: &CStr,
270+
method: &CStr,
271+
descriptor: &CStr,
272+
) -> jmethodID {
251273
let method = ((**self.env).v1_2.GetStaticMethodID)(self.env, class, method.as_ptr(), descriptor.as_ptr());
252-
assert!(!method.is_null());
274+
assert!(
275+
!method.is_null(),
276+
"could not find static method {method:?} {descriptor:?} on class {class_name:?}"
277+
);
253278
method
254279
}
255280

256-
pub unsafe fn require_field(self, class: jclass, field: &CStr, descriptor: &CStr) -> jfieldID {
281+
pub unsafe fn require_field(self, class: jclass, class_name: &CStr, field: &CStr, descriptor: &CStr) -> jfieldID {
257282
let field = ((**self.env).v1_2.GetFieldID)(self.env, class, field.as_ptr(), descriptor.as_ptr());
258-
assert!(!field.is_null());
283+
assert!(
284+
!field.is_null(),
285+
"could not find field {field:?} {descriptor:?} on class {class_name:?}"
286+
);
259287
field
260288
}
261289

262-
pub unsafe fn require_static_field(self, class: jclass, field: &CStr, descriptor: &CStr) -> jfieldID {
290+
pub unsafe fn require_static_field(
291+
self,
292+
class: jclass,
293+
class_name: &CStr,
294+
field: &CStr,
295+
descriptor: &CStr,
296+
) -> jfieldID {
263297
let field = ((**self.env).v1_2.GetStaticFieldID)(self.env, class, field.as_ptr(), descriptor.as_ptr());
264-
assert!(!field.is_null());
298+
assert!(
299+
!field.is_null(),
300+
"could not find static field {field:?} {descriptor:?} on class {class_name:?}"
301+
);
265302
field
266303
}
267304

268305
// Multi-Query Methods
269306
// XXX: Remove these unused functions.
270307

271-
pub unsafe fn require_class_method(self, class: &CStr, method: &CStr, descriptor: &CStr) -> (jclass, jmethodID) {
272-
let class = self.require_class(class);
273-
(class, self.require_method(class, method, descriptor))
308+
pub unsafe fn require_class_method(
309+
self,
310+
class_name: &CStr,
311+
method: &CStr,
312+
descriptor: &CStr,
313+
) -> (jclass, jmethodID) {
314+
let class = self.require_class(class_name);
315+
(class, self.require_method(class, class_name, method, descriptor))
274316
}
275317

276318
pub unsafe fn require_class_static_method(
277319
self,
278-
class: &CStr,
320+
class_name: &CStr,
279321
method: &CStr,
280322
descriptor: &CStr,
281323
) -> (jclass, jmethodID) {
282-
let class = self.require_class(class);
283-
(class, self.require_static_method(class, method, descriptor))
324+
let class = self.require_class(class_name);
325+
(class, self.require_static_method(class, class_name, method, descriptor))
284326
}
285327

286-
pub unsafe fn require_class_field(self, class: &CStr, method: &CStr, descriptor: &CStr) -> (jclass, jfieldID) {
287-
let class = self.require_class(class);
288-
(class, self.require_field(class, method, descriptor))
328+
pub unsafe fn require_class_field(self, class_name: &CStr, method: &CStr, descriptor: &CStr) -> (jclass, jfieldID) {
329+
let class = self.require_class(class_name);
330+
(class, self.require_field(class, class_name, method, descriptor))
289331
}
290332

291333
pub unsafe fn require_class_static_field(
292334
self,
293-
class: &CStr,
335+
class_name: &CStr,
294336
method: &CStr,
295337
descriptor: &CStr,
296338
) -> (jclass, jfieldID) {
297-
let class = self.require_class(class);
298-
(class, self.require_static_field(class, method, descriptor))
339+
let class = self.require_class(class_name);
340+
(class, self.require_static_field(class, class_name, method, descriptor))
299341
}
300342

301343
// Constructor Methods

0 commit comments

Comments
 (0)