Skip to content

Commit 5badc2e

Browse files
authored
[NativeTiming] Clear exceptions after calling JNI methods (#67)
When running `make run-ptests`, the output log is *spammed*: WARNING in native method: JNI call made without checking exceptions when required to from CallStaticVoidMethod Over a million times [^0]. Call `JNIEnv::ExcceptionClear()` after every `JNIEnv::Call*Method()` invocation so that any pending exception is cleared (there *won't* be a pending exception, but the JVM doesn't care), which removes all of these warning messages. [^0]: *Probably*. 100,000 iterations across over 12 steps should exceed a million, unless you're on Android and the iteration count is instead 1,000.
1 parent 2b99104 commit 5badc2e

File tree

1 file changed

+45
-15
lines changed

1 file changed

+45
-15
lines changed

tests/NativeTiming/timing.c

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -229,80 +229,98 @@ foo_get_native_jni_timings (JNIEnv *env, int count, jclass klass, jobject self,
229229
obj3 = (*env)->NewObject(env, Object_class, Object_init);
230230

231231
start = current_time_millis ();
232-
for (i = 0; i < count; i++)
232+
for (i = 0; i < count; i++) {
233233
(*env)->CallStaticVoidMethod (env, klass, Timing_StaticVoidMethod);
234+
(*env)->ExceptionClear (env);
235+
}
234236
end = current_time_millis ();
235237

236238
jniTimes [0] = end - start;
237239
_log ("# NativeTiming: foo/timing: static void method invoke: %10lli ms | average: %10f ms\n",
238240
jniTimes [0], jniTimes [0] / (double) count);
239241

240242
start = current_time_millis ();
241-
for (i = 0; i < count; i++)
243+
for (i = 0; i < count; i++) {
242244
(*env)->CallStaticIntMethod (env, klass, Timing_StaticIntMethod);
245+
(*env)->ExceptionClear (env);
246+
}
243247
end = current_time_millis ();
244248

245249
jniTimes [1] = end - start;
246250
_log ("# NativeTiming: foo/timing: static int method invoke: %10lli ms | average: %10f ms\n",
247251
jniTimes [1], jniTimes [1] / (double) count);
248252

249253
start = current_time_millis ();
250-
for (i = 0; i < count; i++)
254+
for (i = 0; i < count; i++) {
251255
(*env)->CallStaticObjectMethod (env, klass, Timing_StaticObjectMethod);
256+
(*env)->ExceptionClear (env);
257+
}
252258
end = current_time_millis ();
253259

254260
jniTimes [2] = end - start;
255261
_log ("# NativeTiming: foo/timing: static Object method invoke: %10lli ms | average: %10f ms\n",
256262
jniTimes [2], jniTimes [2] / (double) count);
257263

258264
start = current_time_millis ();
259-
for (i = 0; i < count; i++)
265+
for (i = 0; i < count; i++) {
260266
(*env)->CallVoidMethod (env, self, Timing_VirtualVoidMethod);
267+
(*env)->ExceptionClear (env);
268+
}
261269
end = current_time_millis ();
262270

263271
jniTimes [3] = end - start;
264272
_log ("# NativeTiming: foo/timing: virtual void method invoke: %10lli ms | average: %10f ms\n",
265273
jniTimes [3], jniTimes [3] / (double) count);
266274

267275
start = current_time_millis ();
268-
for (i = 0; i < count; i++)
276+
for (i = 0; i < count; i++) {
269277
(*env)->CallIntMethod (env, self, Timing_VirtualIntMethod);
278+
(*env)->ExceptionClear (env);
279+
}
270280
end = current_time_millis ();
271281

272282
jniTimes [4] = end - start;
273283
_log ("# NativeTiming: foo/timing: virtual int method invoke: %10lli ms | average: %10f ms\n",
274284
jniTimes [4], jniTimes [4] / (double) count);
275285

276286
start = current_time_millis ();
277-
for (i = 0; i < count; i++)
287+
for (i = 0; i < count; i++) {
278288
(*env)->CallObjectMethod (env, self, Timing_VirtualObjectMethod);
289+
(*env)->ExceptionClear (env);
290+
}
279291
end = current_time_millis ();
280292

281293
jniTimes [5] = end - start;
282294
_log ("# NativeTiming: foo/timing: virtual Object method invoke: %10lli ms | average: %10f ms\n",
283295
jniTimes [5], jniTimes [5] / (double) count);
284296

285297
start = current_time_millis ();
286-
for (i = 0; i < count; i++)
298+
for (i = 0; i < count; i++) {
287299
(*env)->CallNonvirtualVoidMethod (env, self, klass, Timing_FinalVoidMethod);
300+
(*env)->ExceptionClear (env);
301+
}
288302
end = current_time_millis ();
289303

290304
jniTimes [6] = end - start;
291305
_log ("# NativeTiming: foo/timing: final void method invoke: %10lli ms | average: %10f ms\n",
292306
jniTimes [6], jniTimes [6] / (double) count);
293307

294308
start = current_time_millis ();
295-
for (i = 0; i < count; i++)
309+
for (i = 0; i < count; i++) {
296310
(*env)->CallNonvirtualIntMethod (env, self, klass, Timing_FinalIntMethod);
311+
(*env)->ExceptionClear (env);
312+
}
297313
end = current_time_millis ();
298314

299315
jniTimes [7] = end - start;
300316
_log ("# NativeTiming: foo/timing: final int method invoke: %10lli ms | average: %10f ms\n",
301317
jniTimes [7], jniTimes [7] / (double) count);
302318

303319
start = current_time_millis ();
304-
for (i = 0; i < count; i++)
320+
for (i = 0; i < count; i++) {
305321
(*env)->CallNonvirtualObjectMethod (env, self, klass, Timing_FinalObjectMethod);
322+
(*env)->ExceptionClear (env);
323+
}
306324
end = current_time_millis ();
307325

308326
jniTimes [8] = end - start;
@@ -312,26 +330,32 @@ foo_get_native_jni_timings (JNIEnv *env, int count, jclass klass, jobject self,
312330

313331

314332
start = current_time_millis ();
315-
for (i = 0; i < count; i++)
333+
for (i = 0; i < count; i++) {
316334
(*env)->CallStaticVoidMethod (env, klass, Timing_StaticVoidMethod1Args, obj1);
335+
(*env)->ExceptionClear (env);
336+
}
317337
end = current_time_millis ();
318338

319339
jniTimes [9] = end - start;
320340
_log ("# NativeTiming: foo/timing: static void o1 method invoke: %10lli ms | average: %10f ms\n",
321341
jniTimes [9], jniTimes [9] / (double) count);
322342

323343
start = current_time_millis ();
324-
for (i = 0; i < count; i++)
344+
for (i = 0; i < count; i++) {
325345
(*env)->CallStaticVoidMethod (env, klass, Timing_StaticVoidMethod2Args, obj1, obj2);
346+
(*env)->ExceptionClear (env);
347+
}
326348
end = current_time_millis ();
327349

328350
jniTimes [10] = end - start;
329351
_log ("# NativeTiming: foo/timing: static void o2 method invoke: %10lli ms | average: %10f ms\n",
330352
jniTimes [10], jniTimes [10] / (double) count);
331353

332354
start = current_time_millis ();
333-
for (i = 0; i < count; i++)
355+
for (i = 0; i < count; i++) {
334356
(*env)->CallStaticVoidMethod (env, klass, Timing_StaticVoidMethod3Args, obj1, obj2, obj3);
357+
(*env)->ExceptionClear (env);
358+
}
335359
end = current_time_millis ();
336360

337361
jniTimes [11] = end - start;
@@ -341,26 +365,32 @@ foo_get_native_jni_timings (JNIEnv *env, int count, jclass klass, jobject self,
341365

342366

343367
start = current_time_millis ();
344-
for (i = 0; i < count; i++)
368+
for (i = 0; i < count; i++) {
345369
(*env)->CallStaticVoidMethod (env, klass, Timing_StaticVoidMethod1IArgs, 42);
370+
(*env)->ExceptionClear (env);
371+
}
346372
end = current_time_millis ();
347373

348374
jniTimes [12] = end - start;
349375
_log ("# NativeTiming: foo/timing: static void i1 method invoke: %10lli ms | average: %10f ms\n",
350376
jniTimes [12], jniTimes [12] / (double) count);
351377

352378
start = current_time_millis ();
353-
for (i = 0; i < count; i++)
379+
for (i = 0; i < count; i++) {
354380
(*env)->CallStaticVoidMethod (env, klass, Timing_StaticVoidMethod2IArgs, 42, 42);
381+
(*env)->ExceptionClear (env);
382+
}
355383
end = current_time_millis ();
356384

357385
jniTimes [13] = end - start;
358386
_log ("# NativeTiming: foo/timing: static void i2 method invoke: %10lli ms | average: %10f ms\n",
359387
jniTimes [13], jniTimes [13] / (double) count);
360388

361389
start = current_time_millis ();
362-
for (i = 0; i < count; i++)
390+
for (i = 0; i < count; i++) {
363391
(*env)->CallStaticVoidMethod (env, klass, Timing_StaticVoidMethod3IArgs, 42, 42, 42);
392+
(*env)->ExceptionClear (env);
393+
}
364394
end = current_time_millis ();
365395

366396
jniTimes [14] = end - start;

0 commit comments

Comments
 (0)