From d111f90a386f7bad1474189390fce7a8d1ff1ab5 Mon Sep 17 00:00:00 2001 From: Daniel Colascione Date: Thu, 23 Feb 2017 20:30:00 -0800 Subject: Avoid JNI usage error when JNI_OnLoad throws Test: included Change-Id: I534de714fad2cfb9b53d66da11ade0e5142cb819 --- runtime/java_vm_ext.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'runtime/java_vm_ext.cc') diff --git a/runtime/java_vm_ext.cc b/runtime/java_vm_ext.cc index b93b8f2a97..f2e3353631 100644 --- a/runtime/java_vm_ext.cc +++ b/runtime/java_vm_ext.cc @@ -905,8 +905,20 @@ bool JavaVMExt::LoadNativeLibrary(JNIEnv* env, EnsureFrontOfChain(SIGSEGV); } + // Temporarily reset any pending exception around the call to + // SetClassLoaderOverride: SetClassLoaderOverride creates a new + // global reference, which is illegal while we have an + // exception pending. + jthrowable on_load_exception = env->ExceptionOccurred(); + env->ExceptionClear(); + + // Restore the current class loader (which was overridden above) to the previous state. self->SetClassLoaderOverride(old_class_loader.get()); + if (on_load_exception != nullptr) { + env->Throw(on_load_exception); + } + if (version == JNI_ERR) { StringAppendF(error_msg, "JNI_ERR returned from JNI_OnLoad in \"%s\"", path.c_str()); } else if (JavaVMExt::IsBadJniVersion(version)) { -- cgit v1.2.3-59-g8ed1b