Home | History | Annotate | Download | only in runtime
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "jni_internal.h"
     18 
     19 #include <dlfcn.h>
     20 
     21 #include "art_method.h"
     22 #include "base/dumpable.h"
     23 #include "base/mutex.h"
     24 #include "base/stl_util.h"
     25 #include "base/systrace.h"
     26 #include "check_jni.h"
     27 #include "dex_file-inl.h"
     28 #include "fault_handler.h"
     29 #include "indirect_reference_table-inl.h"
     30 #include "mirror/class-inl.h"
     31 #include "mirror/class_loader.h"
     32 #include "nativebridge/native_bridge.h"
     33 #include "nativeloader/native_loader.h"
     34 #include "java_vm_ext.h"
     35 #include "parsed_options.h"
     36 #include "runtime-inl.h"
     37 #include "runtime_options.h"
     38 #include "ScopedLocalRef.h"
     39 #include "scoped_thread_state_change.h"
     40 #include "thread-inl.h"
     41 #include "thread_list.h"
     42 
     43 namespace art {
     44 
     45 static size_t gGlobalsInitial = 512;  // Arbitrary.
     46 static size_t gGlobalsMax = 51200;  // Arbitrary sanity check. (Must fit in 16 bits.)
     47 
     48 static const size_t kWeakGlobalsInitial = 16;  // Arbitrary.
     49 static const size_t kWeakGlobalsMax = 51200;  // Arbitrary sanity check. (Must fit in 16 bits.)
     50 
     51 static bool IsBadJniVersion(int version) {
     52   // We don't support JNI_VERSION_1_1. These are the only other valid versions.
     53   return version != JNI_VERSION_1_2 && version != JNI_VERSION_1_4 && version != JNI_VERSION_1_6;
     54 }
     55 
     56 class SharedLibrary {
     57  public:
     58   SharedLibrary(JNIEnv* env, Thread* self, const std::string& path, void* handle,
     59                 jobject class_loader, void* class_loader_allocator)
     60       : path_(path),
     61         handle_(handle),
     62         needs_native_bridge_(false),
     63         class_loader_(env->NewWeakGlobalRef(class_loader)),
     64         class_loader_allocator_(class_loader_allocator),
     65         jni_on_load_lock_("JNI_OnLoad lock"),
     66         jni_on_load_cond_("JNI_OnLoad condition variable", jni_on_load_lock_),
     67         jni_on_load_thread_id_(self->GetThreadId()),
     68         jni_on_load_result_(kPending) {
     69     CHECK(class_loader_allocator_ != nullptr);
     70   }
     71 
     72   ~SharedLibrary() {
     73     Thread* self = Thread::Current();
     74     if (self != nullptr) {
     75       self->GetJniEnv()->DeleteWeakGlobalRef(class_loader_);
     76     }
     77 
     78     if (!needs_native_bridge_) {
     79       android::CloseNativeLibrary(handle_);
     80     }
     81   }
     82 
     83   jweak GetClassLoader() const {
     84     return class_loader_;
     85   }
     86 
     87   const void* GetClassLoaderAllocator() const {
     88     return class_loader_allocator_;
     89   }
     90 
     91   const std::string& GetPath() const {
     92     return path_;
     93   }
     94 
     95   /*
     96    * Check the result of an earlier call to JNI_OnLoad on this library.
     97    * If the call has not yet finished in another thread, wait for it.
     98    */
     99   bool CheckOnLoadResult()
    100       REQUIRES(!jni_on_load_lock_) {
    101     Thread* self = Thread::Current();
    102     bool okay;
    103     {
    104       MutexLock mu(self, jni_on_load_lock_);
    105 
    106       if (jni_on_load_thread_id_ == self->GetThreadId()) {
    107         // Check this so we don't end up waiting for ourselves.  We need to return "true" so the
    108         // caller can continue.
    109         LOG(INFO) << *self << " recursive attempt to load library " << "\"" << path_ << "\"";
    110         okay = true;
    111       } else {
    112         while (jni_on_load_result_ == kPending) {
    113           VLOG(jni) << "[" << *self << " waiting for \"" << path_ << "\" " << "JNI_OnLoad...]";
    114           jni_on_load_cond_.Wait(self);
    115         }
    116 
    117         okay = (jni_on_load_result_ == kOkay);
    118         VLOG(jni) << "[Earlier JNI_OnLoad for \"" << path_ << "\" "
    119             << (okay ? "succeeded" : "failed") << "]";
    120       }
    121     }
    122     return okay;
    123   }
    124 
    125   void SetResult(bool result) REQUIRES(!jni_on_load_lock_) {
    126     Thread* self = Thread::Current();
    127     MutexLock mu(self, jni_on_load_lock_);
    128 
    129     jni_on_load_result_ = result ? kOkay : kFailed;
    130     jni_on_load_thread_id_ = 0;
    131 
    132     // Broadcast a wakeup to anybody sleeping on the condition variable.
    133     jni_on_load_cond_.Broadcast(self);
    134   }
    135 
    136   void SetNeedsNativeBridge() {
    137     needs_native_bridge_ = true;
    138   }
    139 
    140   bool NeedsNativeBridge() const {
    141     return needs_native_bridge_;
    142   }
    143 
    144   void* FindSymbol(const std::string& symbol_name, const char* shorty = nullptr) {
    145     return NeedsNativeBridge()
    146         ? FindSymbolWithNativeBridge(symbol_name.c_str(), shorty)
    147         : FindSymbolWithoutNativeBridge(symbol_name.c_str());
    148   }
    149 
    150   void* FindSymbolWithoutNativeBridge(const std::string& symbol_name) {
    151     CHECK(!NeedsNativeBridge());
    152 
    153     return dlsym(handle_, symbol_name.c_str());
    154   }
    155 
    156   void* FindSymbolWithNativeBridge(const std::string& symbol_name, const char* shorty) {
    157     CHECK(NeedsNativeBridge());
    158 
    159     uint32_t len = 0;
    160     return android::NativeBridgeGetTrampoline(handle_, symbol_name.c_str(), shorty, len);
    161   }
    162 
    163  private:
    164   enum JNI_OnLoadState {
    165     kPending,
    166     kFailed,
    167     kOkay,
    168   };
    169 
    170   // Path to library "/system/lib/libjni.so".
    171   const std::string path_;
    172 
    173   // The void* returned by dlopen(3).
    174   void* const handle_;
    175 
    176   // True if a native bridge is required.
    177   bool needs_native_bridge_;
    178 
    179   // The ClassLoader this library is associated with, a weak global JNI reference that is
    180   // created/deleted with the scope of the library.
    181   const jweak class_loader_;
    182   // Used to do equality check on class loaders so we can avoid decoding the weak root and read
    183   // barriers that mess with class unloading.
    184   const void* class_loader_allocator_;
    185 
    186   // Guards remaining items.
    187   Mutex jni_on_load_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
    188   // Wait for JNI_OnLoad in other thread.
    189   ConditionVariable jni_on_load_cond_ GUARDED_BY(jni_on_load_lock_);
    190   // Recursive invocation guard.
    191   uint32_t jni_on_load_thread_id_ GUARDED_BY(jni_on_load_lock_);
    192   // Result of earlier JNI_OnLoad call.
    193   JNI_OnLoadState jni_on_load_result_ GUARDED_BY(jni_on_load_lock_);
    194 };
    195 
    196 // This exists mainly to keep implementation details out of the header file.
    197 class Libraries {
    198  public:
    199   Libraries() {
    200   }
    201 
    202   ~Libraries() {
    203     STLDeleteValues(&libraries_);
    204   }
    205 
    206   // NO_THREAD_SAFETY_ANALYSIS since this may be called from Dumpable. Dumpable can't be annotated
    207   // properly due to the template. The caller should be holding the jni_libraries_lock_.
    208   void Dump(std::ostream& os) const NO_THREAD_SAFETY_ANALYSIS {
    209     Locks::jni_libraries_lock_->AssertHeld(Thread::Current());
    210     bool first = true;
    211     for (const auto& library : libraries_) {
    212       if (!first) {
    213         os << ' ';
    214       }
    215       first = false;
    216       os << library.first;
    217     }
    218   }
    219 
    220   size_t size() const REQUIRES(Locks::jni_libraries_lock_) {
    221     return libraries_.size();
    222   }
    223 
    224   SharedLibrary* Get(const std::string& path) REQUIRES(Locks::jni_libraries_lock_) {
    225     auto it = libraries_.find(path);
    226     return (it == libraries_.end()) ? nullptr : it->second;
    227   }
    228 
    229   void Put(const std::string& path, SharedLibrary* library)
    230       REQUIRES(Locks::jni_libraries_lock_) {
    231     libraries_.Put(path, library);
    232   }
    233 
    234   // See section 11.3 "Linking Native Methods" of the JNI spec.
    235   void* FindNativeMethod(ArtMethod* m, std::string& detail)
    236       REQUIRES(Locks::jni_libraries_lock_)
    237       SHARED_REQUIRES(Locks::mutator_lock_) {
    238     std::string jni_short_name(JniShortName(m));
    239     std::string jni_long_name(JniLongName(m));
    240     mirror::ClassLoader* const declaring_class_loader = m->GetDeclaringClass()->GetClassLoader();
    241     ScopedObjectAccessUnchecked soa(Thread::Current());
    242     void* const declaring_class_loader_allocator =
    243         Runtime::Current()->GetClassLinker()->GetAllocatorForClassLoader(declaring_class_loader);
    244     CHECK(declaring_class_loader_allocator != nullptr);
    245     for (const auto& lib : libraries_) {
    246       SharedLibrary* const library = lib.second;
    247       // Use the allocator address for class loader equality to avoid unnecessary weak root decode.
    248       if (library->GetClassLoaderAllocator() != declaring_class_loader_allocator) {
    249         // We only search libraries loaded by the appropriate ClassLoader.
    250         continue;
    251       }
    252       // Try the short name then the long name...
    253       const char* shorty = library->NeedsNativeBridge()
    254           ? m->GetShorty()
    255           : nullptr;
    256       void* fn = library->FindSymbol(jni_short_name, shorty);
    257       if (fn == nullptr) {
    258         fn = library->FindSymbol(jni_long_name, shorty);
    259       }
    260       if (fn != nullptr) {
    261         VLOG(jni) << "[Found native code for " << PrettyMethod(m)
    262                   << " in \"" << library->GetPath() << "\"]";
    263         return fn;
    264       }
    265     }
    266     detail += "No implementation found for ";
    267     detail += PrettyMethod(m);
    268     detail += " (tried " + jni_short_name + " and " + jni_long_name + ")";
    269     LOG(ERROR) << detail;
    270     return nullptr;
    271   }
    272 
    273   // Unload native libraries with cleared class loaders.
    274   void UnloadNativeLibraries()
    275       REQUIRES(!Locks::jni_libraries_lock_)
    276       SHARED_REQUIRES(Locks::mutator_lock_) {
    277     ScopedObjectAccessUnchecked soa(Thread::Current());
    278     std::vector<SharedLibrary*> unload_libraries;
    279     {
    280       MutexLock mu(soa.Self(), *Locks::jni_libraries_lock_);
    281       for (auto it = libraries_.begin(); it != libraries_.end(); ) {
    282         SharedLibrary* const library = it->second;
    283         // If class loader is null then it was unloaded, call JNI_OnUnload.
    284         const jweak class_loader = library->GetClassLoader();
    285         // If class_loader is a null jobject then it is the boot class loader. We should not unload
    286         // the native libraries of the boot class loader.
    287         if (class_loader != nullptr &&
    288             soa.Self()->IsJWeakCleared(class_loader)) {
    289           unload_libraries.push_back(library);
    290           it = libraries_.erase(it);
    291         } else {
    292           ++it;
    293         }
    294       }
    295     }
    296     // Do this without holding the jni libraries lock to prevent possible deadlocks.
    297     typedef void (*JNI_OnUnloadFn)(JavaVM*, void*);
    298     for (auto library : unload_libraries) {
    299       void* const sym = library->FindSymbol("JNI_OnUnload", nullptr);
    300       if (sym == nullptr) {
    301         VLOG(jni) << "[No JNI_OnUnload found in \"" << library->GetPath() << "\"]";
    302       } else {
    303         VLOG(jni) << "[JNI_OnUnload found for \"" << library->GetPath() << "\"]: Calling...";
    304         JNI_OnUnloadFn jni_on_unload = reinterpret_cast<JNI_OnUnloadFn>(sym);
    305         jni_on_unload(soa.Vm(), nullptr);
    306       }
    307       delete library;
    308     }
    309   }
    310 
    311  private:
    312   AllocationTrackingSafeMap<std::string, SharedLibrary*, kAllocatorTagJNILibraries> libraries_
    313       GUARDED_BY(Locks::jni_libraries_lock_);
    314 };
    315 
    316 class JII {
    317  public:
    318   static jint DestroyJavaVM(JavaVM* vm) {
    319     if (vm == nullptr) {
    320       return JNI_ERR;
    321     }
    322     JavaVMExt* raw_vm = reinterpret_cast<JavaVMExt*>(vm);
    323     delete raw_vm->GetRuntime();
    324     android::ResetNativeLoader();
    325     return JNI_OK;
    326   }
    327 
    328   static jint AttachCurrentThread(JavaVM* vm, JNIEnv** p_env, void* thr_args) {
    329     return AttachCurrentThreadInternal(vm, p_env, thr_args, false);
    330   }
    331 
    332   static jint AttachCurrentThreadAsDaemon(JavaVM* vm, JNIEnv** p_env, void* thr_args) {
    333     return AttachCurrentThreadInternal(vm, p_env, thr_args, true);
    334   }
    335 
    336   static jint DetachCurrentThread(JavaVM* vm) {
    337     if (vm == nullptr || Thread::Current() == nullptr) {
    338       return JNI_ERR;
    339     }
    340     JavaVMExt* raw_vm = reinterpret_cast<JavaVMExt*>(vm);
    341     Runtime* runtime = raw_vm->GetRuntime();
    342     runtime->DetachCurrentThread();
    343     return JNI_OK;
    344   }
    345 
    346   static jint GetEnv(JavaVM* vm, void** env, jint version) {
    347     // GetEnv always returns a JNIEnv* for the most current supported JNI version,
    348     // and unlike other calls that take a JNI version doesn't care if you supply
    349     // JNI_VERSION_1_1, which we don't otherwise support.
    350     if (IsBadJniVersion(version) && version != JNI_VERSION_1_1) {
    351       LOG(ERROR) << "Bad JNI version passed to GetEnv: " << version;
    352       return JNI_EVERSION;
    353     }
    354     if (vm == nullptr || env == nullptr) {
    355       return JNI_ERR;
    356     }
    357     Thread* thread = Thread::Current();
    358     if (thread == nullptr) {
    359       *env = nullptr;
    360       return JNI_EDETACHED;
    361     }
    362     *env = thread->GetJniEnv();
    363     return JNI_OK;
    364   }
    365 
    366  private:
    367   static jint AttachCurrentThreadInternal(JavaVM* vm, JNIEnv** p_env, void* raw_args, bool as_daemon) {
    368     if (vm == nullptr || p_env == nullptr) {
    369       return JNI_ERR;
    370     }
    371 
    372     // Return immediately if we're already attached.
    373     Thread* self = Thread::Current();
    374     if (self != nullptr) {
    375       *p_env = self->GetJniEnv();
    376       return JNI_OK;
    377     }
    378 
    379     Runtime* runtime = reinterpret_cast<JavaVMExt*>(vm)->GetRuntime();
    380 
    381     // No threads allowed in zygote mode.
    382     if (runtime->IsZygote()) {
    383       LOG(ERROR) << "Attempt to attach a thread in the zygote";
    384       return JNI_ERR;
    385     }
    386 
    387     JavaVMAttachArgs* args = static_cast<JavaVMAttachArgs*>(raw_args);
    388     const char* thread_name = nullptr;
    389     jobject thread_group = nullptr;
    390     if (args != nullptr) {
    391       if (IsBadJniVersion(args->version)) {
    392         LOG(ERROR) << "Bad JNI version passed to "
    393                    << (as_daemon ? "AttachCurrentThreadAsDaemon" : "AttachCurrentThread") << ": "
    394                    << args->version;
    395         return JNI_EVERSION;
    396       }
    397       thread_name = args->name;
    398       thread_group = args->group;
    399     }
    400 
    401     if (!runtime->AttachCurrentThread(thread_name, as_daemon, thread_group,
    402                                       !runtime->IsAotCompiler())) {
    403       *p_env = nullptr;
    404       return JNI_ERR;
    405     } else {
    406       *p_env = Thread::Current()->GetJniEnv();
    407       return JNI_OK;
    408     }
    409   }
    410 };
    411 
    412 const JNIInvokeInterface gJniInvokeInterface = {
    413   nullptr,  // reserved0
    414   nullptr,  // reserved1
    415   nullptr,  // reserved2
    416   JII::DestroyJavaVM,
    417   JII::AttachCurrentThread,
    418   JII::DetachCurrentThread,
    419   JII::GetEnv,
    420   JII::AttachCurrentThreadAsDaemon
    421 };
    422 
    423 JavaVMExt::JavaVMExt(Runtime* runtime, const RuntimeArgumentMap& runtime_options)
    424     : runtime_(runtime),
    425       check_jni_abort_hook_(nullptr),
    426       check_jni_abort_hook_data_(nullptr),
    427       check_jni_(false),  // Initialized properly in the constructor body below.
    428       force_copy_(runtime_options.Exists(RuntimeArgumentMap::JniOptsForceCopy)),
    429       tracing_enabled_(runtime_options.Exists(RuntimeArgumentMap::JniTrace)
    430                        || VLOG_IS_ON(third_party_jni)),
    431       trace_(runtime_options.GetOrDefault(RuntimeArgumentMap::JniTrace)),
    432       globals_lock_("JNI global reference table lock"),
    433       globals_(gGlobalsInitial, gGlobalsMax, kGlobal),
    434       libraries_(new Libraries),
    435       unchecked_functions_(&gJniInvokeInterface),
    436       weak_globals_lock_("JNI weak global reference table lock", kJniWeakGlobalsLock),
    437       weak_globals_(kWeakGlobalsInitial, kWeakGlobalsMax, kWeakGlobal),
    438       allow_accessing_weak_globals_(true),
    439       weak_globals_add_condition_("weak globals add condition", weak_globals_lock_) {
    440   functions = unchecked_functions_;
    441   SetCheckJniEnabled(runtime_options.Exists(RuntimeArgumentMap::CheckJni));
    442 }
    443 
    444 JavaVMExt::~JavaVMExt() {
    445 }
    446 
    447 void JavaVMExt::JniAbort(const char* jni_function_name, const char* msg) {
    448   Thread* self = Thread::Current();
    449   ScopedObjectAccess soa(self);
    450   ArtMethod* current_method = self->GetCurrentMethod(nullptr);
    451 
    452   std::ostringstream os;
    453   os << "JNI DETECTED ERROR IN APPLICATION: " << msg;
    454 
    455   if (jni_function_name != nullptr) {
    456     os << "\n    in call to " << jni_function_name;
    457   }
    458   // TODO: is this useful given that we're about to dump the calling thread's stack?
    459   if (current_method != nullptr) {
    460     os << "\n    from " << PrettyMethod(current_method);
    461   }
    462   os << "\n";
    463   self->Dump(os);
    464 
    465   if (check_jni_abort_hook_ != nullptr) {
    466     check_jni_abort_hook_(check_jni_abort_hook_data_, os.str());
    467   } else {
    468     // Ensure that we get a native stack trace for this thread.
    469     ScopedThreadSuspension sts(self, kNative);
    470     LOG(FATAL) << os.str();
    471     UNREACHABLE();
    472   }
    473 }
    474 
    475 void JavaVMExt::JniAbortV(const char* jni_function_name, const char* fmt, va_list ap) {
    476   std::string msg;
    477   StringAppendV(&msg, fmt, ap);
    478   JniAbort(jni_function_name, msg.c_str());
    479 }
    480 
    481 void JavaVMExt::JniAbortF(const char* jni_function_name, const char* fmt, ...) {
    482   va_list args;
    483   va_start(args, fmt);
    484   JniAbortV(jni_function_name, fmt, args);
    485   va_end(args);
    486 }
    487 
    488 bool JavaVMExt::ShouldTrace(ArtMethod* method) {
    489   // Fast where no tracing is enabled.
    490   if (trace_.empty() && !VLOG_IS_ON(third_party_jni)) {
    491     return false;
    492   }
    493   // Perform checks based on class name.
    494   StringPiece class_name(method->GetDeclaringClassDescriptor());
    495   if (!trace_.empty() && class_name.find(trace_) != std::string::npos) {
    496     return true;
    497   }
    498   if (!VLOG_IS_ON(third_party_jni)) {
    499     return false;
    500   }
    501   // Return true if we're trying to log all third-party JNI activity and 'method' doesn't look
    502   // like part of Android.
    503   static const char* gBuiltInPrefixes[] = {
    504       "Landroid/",
    505       "Lcom/android/",
    506       "Lcom/google/android/",
    507       "Ldalvik/",
    508       "Ljava/",
    509       "Ljavax/",
    510       "Llibcore/",
    511       "Lorg/apache/harmony/",
    512   };
    513   for (size_t i = 0; i < arraysize(gBuiltInPrefixes); ++i) {
    514     if (class_name.starts_with(gBuiltInPrefixes[i])) {
    515       return false;
    516     }
    517   }
    518   return true;
    519 }
    520 
    521 jobject JavaVMExt::AddGlobalRef(Thread* self, mirror::Object* obj) {
    522   // Check for null after decoding the object to handle cleared weak globals.
    523   if (obj == nullptr) {
    524     return nullptr;
    525   }
    526   WriterMutexLock mu(self, globals_lock_);
    527   IndirectRef ref = globals_.Add(IRT_FIRST_SEGMENT, obj);
    528   return reinterpret_cast<jobject>(ref);
    529 }
    530 
    531 jweak JavaVMExt::AddWeakGlobalRef(Thread* self, mirror::Object* obj) {
    532   if (obj == nullptr) {
    533     return nullptr;
    534   }
    535   MutexLock mu(self, weak_globals_lock_);
    536   while (UNLIKELY(!MayAccessWeakGlobals(self))) {
    537     weak_globals_add_condition_.WaitHoldingLocks(self);
    538   }
    539   IndirectRef ref = weak_globals_.Add(IRT_FIRST_SEGMENT, obj);
    540   return reinterpret_cast<jweak>(ref);
    541 }
    542 
    543 void JavaVMExt::DeleteGlobalRef(Thread* self, jobject obj) {
    544   if (obj == nullptr) {
    545     return;
    546   }
    547   WriterMutexLock mu(self, globals_lock_);
    548   if (!globals_.Remove(IRT_FIRST_SEGMENT, obj)) {
    549     LOG(WARNING) << "JNI WARNING: DeleteGlobalRef(" << obj << ") "
    550                  << "failed to find entry";
    551   }
    552 }
    553 
    554 void JavaVMExt::DeleteWeakGlobalRef(Thread* self, jweak obj) {
    555   if (obj == nullptr) {
    556     return;
    557   }
    558   MutexLock mu(self, weak_globals_lock_);
    559   if (!weak_globals_.Remove(IRT_FIRST_SEGMENT, obj)) {
    560     LOG(WARNING) << "JNI WARNING: DeleteWeakGlobalRef(" << obj << ") "
    561                  << "failed to find entry";
    562   }
    563 }
    564 
    565 static void ThreadEnableCheckJni(Thread* thread, void* arg) {
    566   bool* check_jni = reinterpret_cast<bool*>(arg);
    567   thread->GetJniEnv()->SetCheckJniEnabled(*check_jni);
    568 }
    569 
    570 bool JavaVMExt::SetCheckJniEnabled(bool enabled) {
    571   bool old_check_jni = check_jni_;
    572   check_jni_ = enabled;
    573   functions = enabled ? GetCheckJniInvokeInterface() : unchecked_functions_;
    574   MutexLock mu(Thread::Current(), *Locks::thread_list_lock_);
    575   runtime_->GetThreadList()->ForEach(ThreadEnableCheckJni, &check_jni_);
    576   return old_check_jni;
    577 }
    578 
    579 void JavaVMExt::DumpForSigQuit(std::ostream& os) {
    580   os << "JNI: CheckJNI is " << (check_jni_ ? "on" : "off");
    581   if (force_copy_) {
    582     os << " (with forcecopy)";
    583   }
    584   Thread* self = Thread::Current();
    585   {
    586     ReaderMutexLock mu(self, globals_lock_);
    587     os << "; globals=" << globals_.Capacity();
    588   }
    589   {
    590     MutexLock mu(self, weak_globals_lock_);
    591     if (weak_globals_.Capacity() > 0) {
    592       os << " (plus " << weak_globals_.Capacity() << " weak)";
    593     }
    594   }
    595   os << '\n';
    596 
    597   {
    598     MutexLock mu(self, *Locks::jni_libraries_lock_);
    599     os << "Libraries: " << Dumpable<Libraries>(*libraries_) << " (" << libraries_->size() << ")\n";
    600   }
    601 }
    602 
    603 void JavaVMExt::DisallowNewWeakGlobals() {
    604   CHECK(!kUseReadBarrier);
    605   Thread* const self = Thread::Current();
    606   MutexLock mu(self, weak_globals_lock_);
    607   // DisallowNewWeakGlobals is only called by CMS during the pause. It is required to have the
    608   // mutator lock exclusively held so that we don't have any threads in the middle of
    609   // DecodeWeakGlobal.
    610   Locks::mutator_lock_->AssertExclusiveHeld(self);
    611   allow_accessing_weak_globals_.StoreSequentiallyConsistent(false);
    612 }
    613 
    614 void JavaVMExt::AllowNewWeakGlobals() {
    615   CHECK(!kUseReadBarrier);
    616   Thread* self = Thread::Current();
    617   MutexLock mu(self, weak_globals_lock_);
    618   allow_accessing_weak_globals_.StoreSequentiallyConsistent(true);
    619   weak_globals_add_condition_.Broadcast(self);
    620 }
    621 
    622 void JavaVMExt::BroadcastForNewWeakGlobals() {
    623   CHECK(kUseReadBarrier);
    624   Thread* self = Thread::Current();
    625   MutexLock mu(self, weak_globals_lock_);
    626   weak_globals_add_condition_.Broadcast(self);
    627 }
    628 
    629 mirror::Object* JavaVMExt::DecodeGlobal(IndirectRef ref) {
    630   return globals_.SynchronizedGet(ref);
    631 }
    632 
    633 void JavaVMExt::UpdateGlobal(Thread* self, IndirectRef ref, mirror::Object* result) {
    634   WriterMutexLock mu(self, globals_lock_);
    635   globals_.Update(ref, result);
    636 }
    637 
    638 inline bool JavaVMExt::MayAccessWeakGlobals(Thread* self) const {
    639   return MayAccessWeakGlobalsUnlocked(self);
    640 }
    641 
    642 inline bool JavaVMExt::MayAccessWeakGlobalsUnlocked(Thread* self) const {
    643   DCHECK(self != nullptr);
    644   return kUseReadBarrier ?
    645       self->GetWeakRefAccessEnabled() :
    646       allow_accessing_weak_globals_.LoadSequentiallyConsistent();
    647 }
    648 
    649 mirror::Object* JavaVMExt::DecodeWeakGlobal(Thread* self, IndirectRef ref) {
    650   // It is safe to access GetWeakRefAccessEnabled without the lock since CC uses checkpoints to call
    651   // SetWeakRefAccessEnabled, and the other collectors only modify allow_accessing_weak_globals_
    652   // when the mutators are paused.
    653   // This only applies in the case where MayAccessWeakGlobals goes from false to true. In the other
    654   // case, it may be racy, this is benign since DecodeWeakGlobalLocked does the correct behavior
    655   // if MayAccessWeakGlobals is false.
    656   DCHECK_EQ(GetIndirectRefKind(ref), kWeakGlobal);
    657   if (LIKELY(MayAccessWeakGlobalsUnlocked(self))) {
    658     return weak_globals_.SynchronizedGet(ref);
    659   }
    660   MutexLock mu(self, weak_globals_lock_);
    661   return DecodeWeakGlobalLocked(self, ref);
    662 }
    663 
    664 mirror::Object* JavaVMExt::DecodeWeakGlobalLocked(Thread* self, IndirectRef ref) {
    665   if (kDebugLocking) {
    666     weak_globals_lock_.AssertHeld(self);
    667   }
    668   while (UNLIKELY(!MayAccessWeakGlobals(self))) {
    669     weak_globals_add_condition_.WaitHoldingLocks(self);
    670   }
    671   return weak_globals_.Get(ref);
    672 }
    673 
    674 mirror::Object* JavaVMExt::DecodeWeakGlobalDuringShutdown(Thread* self, IndirectRef ref) {
    675   DCHECK_EQ(GetIndirectRefKind(ref), kWeakGlobal);
    676   DCHECK(Runtime::Current()->IsShuttingDown(self));
    677   if (self != nullptr) {
    678     return DecodeWeakGlobal(self, ref);
    679   }
    680   // self can be null during a runtime shutdown. ~Runtime()->~ClassLinker()->DecodeWeakGlobal().
    681   if (!kUseReadBarrier) {
    682     DCHECK(allow_accessing_weak_globals_.LoadSequentiallyConsistent());
    683   }
    684   return weak_globals_.SynchronizedGet(ref);
    685 }
    686 
    687 bool JavaVMExt::IsWeakGlobalCleared(Thread* self, IndirectRef ref) {
    688   DCHECK_EQ(GetIndirectRefKind(ref), kWeakGlobal);
    689   MutexLock mu(self, weak_globals_lock_);
    690   while (UNLIKELY(!MayAccessWeakGlobals(self))) {
    691     weak_globals_add_condition_.WaitHoldingLocks(self);
    692   }
    693   // When just checking a weak ref has been cleared, avoid triggering the read barrier in decode
    694   // (DecodeWeakGlobal) so that we won't accidentally mark the object alive. Since the cleared
    695   // sentinel is a non-moving object, we can compare the ref to it without the read barrier and
    696   // decide if it's cleared.
    697   return Runtime::Current()->IsClearedJniWeakGlobal(weak_globals_.Get<kWithoutReadBarrier>(ref));
    698 }
    699 
    700 void JavaVMExt::UpdateWeakGlobal(Thread* self, IndirectRef ref, mirror::Object* result) {
    701   MutexLock mu(self, weak_globals_lock_);
    702   weak_globals_.Update(ref, result);
    703 }
    704 
    705 void JavaVMExt::DumpReferenceTables(std::ostream& os) {
    706   Thread* self = Thread::Current();
    707   {
    708     ReaderMutexLock mu(self, globals_lock_);
    709     globals_.Dump(os);
    710   }
    711   {
    712     MutexLock mu(self, weak_globals_lock_);
    713     weak_globals_.Dump(os);
    714   }
    715 }
    716 
    717 void JavaVMExt::UnloadNativeLibraries() {
    718   libraries_.get()->UnloadNativeLibraries();
    719 }
    720 
    721 bool JavaVMExt::LoadNativeLibrary(JNIEnv* env,
    722                                   const std::string& path,
    723                                   jobject class_loader,
    724                                   jstring library_path,
    725                                   std::string* error_msg) {
    726   error_msg->clear();
    727 
    728   // See if we've already loaded this library.  If we have, and the class loader
    729   // matches, return successfully without doing anything.
    730   // TODO: for better results we should canonicalize the pathname (or even compare
    731   // inodes). This implementation is fine if everybody is using System.loadLibrary.
    732   SharedLibrary* library;
    733   Thread* self = Thread::Current();
    734   {
    735     // TODO: move the locking (and more of this logic) into Libraries.
    736     MutexLock mu(self, *Locks::jni_libraries_lock_);
    737     library = libraries_->Get(path);
    738   }
    739   void* class_loader_allocator = nullptr;
    740   {
    741     ScopedObjectAccess soa(env);
    742     // As the incoming class loader is reachable/alive during the call of this function,
    743     // it's okay to decode it without worrying about unexpectedly marking it alive.
    744     mirror::ClassLoader* loader = soa.Decode<mirror::ClassLoader*>(class_loader);
    745 
    746     ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
    747     if (class_linker->IsBootClassLoader(soa, loader)) {
    748       loader = nullptr;
    749       class_loader = nullptr;
    750     }
    751 
    752     class_loader_allocator = class_linker->GetAllocatorForClassLoader(loader);
    753     CHECK(class_loader_allocator != nullptr);
    754   }
    755   if (library != nullptr) {
    756     // Use the allocator pointers for class loader equality to avoid unnecessary weak root decode.
    757     if (library->GetClassLoaderAllocator() != class_loader_allocator) {
    758       // The library will be associated with class_loader. The JNI
    759       // spec says we can't load the same library into more than one
    760       // class loader.
    761       StringAppendF(error_msg, "Shared library \"%s\" already opened by "
    762           "ClassLoader %p; can't open in ClassLoader %p",
    763           path.c_str(), library->GetClassLoader(), class_loader);
    764       LOG(WARNING) << error_msg;
    765       return false;
    766     }
    767     VLOG(jni) << "[Shared library \"" << path << "\" already loaded in "
    768               << " ClassLoader " << class_loader << "]";
    769     if (!library->CheckOnLoadResult()) {
    770       StringAppendF(error_msg, "JNI_OnLoad failed on a previous attempt "
    771           "to load \"%s\"", path.c_str());
    772       return false;
    773     }
    774     return true;
    775   }
    776 
    777   // Open the shared library.  Because we're using a full path, the system
    778   // doesn't have to search through LD_LIBRARY_PATH.  (It may do so to
    779   // resolve this library's dependencies though.)
    780 
    781   // Failures here are expected when java.library.path has several entries
    782   // and we have to hunt for the lib.
    783 
    784   // Below we dlopen but there is no paired dlclose, this would be necessary if we supported
    785   // class unloading. Libraries will only be unloaded when the reference count (incremented by
    786   // dlopen) becomes zero from dlclose.
    787 
    788   Locks::mutator_lock_->AssertNotHeld(self);
    789   const char* path_str = path.empty() ? nullptr : path.c_str();
    790   void* handle = android::OpenNativeLibrary(env,
    791                                             runtime_->GetTargetSdkVersion(),
    792                                             path_str,
    793                                             class_loader,
    794                                             library_path);
    795 
    796   bool needs_native_bridge = false;
    797   if (handle == nullptr) {
    798     if (android::NativeBridgeIsSupported(path_str)) {
    799       handle = android::NativeBridgeLoadLibrary(path_str, RTLD_NOW);
    800       needs_native_bridge = true;
    801     }
    802   }
    803 
    804   VLOG(jni) << "[Call to dlopen(\"" << path << "\", RTLD_NOW) returned " << handle << "]";
    805 
    806   if (handle == nullptr) {
    807     *error_msg = dlerror();
    808     VLOG(jni) << "dlopen(\"" << path << "\", RTLD_NOW) failed: " << *error_msg;
    809     return false;
    810   }
    811 
    812   if (env->ExceptionCheck() == JNI_TRUE) {
    813     LOG(ERROR) << "Unexpected exception:";
    814     env->ExceptionDescribe();
    815     env->ExceptionClear();
    816   }
    817   // Create a new entry.
    818   // TODO: move the locking (and more of this logic) into Libraries.
    819   bool created_library = false;
    820   {
    821     // Create SharedLibrary ahead of taking the libraries lock to maintain lock ordering.
    822     std::unique_ptr<SharedLibrary> new_library(
    823         new SharedLibrary(env, self, path, handle, class_loader, class_loader_allocator));
    824     MutexLock mu(self, *Locks::jni_libraries_lock_);
    825     library = libraries_->Get(path);
    826     if (library == nullptr) {  // We won race to get libraries_lock.
    827       library = new_library.release();
    828       libraries_->Put(path, library);
    829       created_library = true;
    830     }
    831   }
    832   if (!created_library) {
    833     LOG(INFO) << "WOW: we lost a race to add shared library: "
    834         << "\"" << path << "\" ClassLoader=" << class_loader;
    835     return library->CheckOnLoadResult();
    836   }
    837   VLOG(jni) << "[Added shared library \"" << path << "\" for ClassLoader " << class_loader << "]";
    838 
    839   bool was_successful = false;
    840   void* sym;
    841   if (needs_native_bridge) {
    842     library->SetNeedsNativeBridge();
    843   }
    844   sym = library->FindSymbol("JNI_OnLoad", nullptr);
    845   if (sym == nullptr) {
    846     VLOG(jni) << "[No JNI_OnLoad found in \"" << path << "\"]";
    847     was_successful = true;
    848   } else {
    849     // Call JNI_OnLoad.  We have to override the current class
    850     // loader, which will always be "null" since the stuff at the
    851     // top of the stack is around Runtime.loadLibrary().  (See
    852     // the comments in the JNI FindClass function.)
    853     ScopedLocalRef<jobject> old_class_loader(env, env->NewLocalRef(self->GetClassLoaderOverride()));
    854     self->SetClassLoaderOverride(class_loader);
    855 
    856     VLOG(jni) << "[Calling JNI_OnLoad in \"" << path << "\"]";
    857     typedef int (*JNI_OnLoadFn)(JavaVM*, void*);
    858     JNI_OnLoadFn jni_on_load = reinterpret_cast<JNI_OnLoadFn>(sym);
    859     int version = (*jni_on_load)(this, nullptr);
    860 
    861     if (runtime_->GetTargetSdkVersion() != 0 && runtime_->GetTargetSdkVersion() <= 21) {
    862       fault_manager.EnsureArtActionInFrontOfSignalChain();
    863     }
    864 
    865     self->SetClassLoaderOverride(old_class_loader.get());
    866 
    867     if (version == JNI_ERR) {
    868       StringAppendF(error_msg, "JNI_ERR returned from JNI_OnLoad in \"%s\"", path.c_str());
    869     } else if (IsBadJniVersion(version)) {
    870       StringAppendF(error_msg, "Bad JNI version returned from JNI_OnLoad in \"%s\": %d",
    871                     path.c_str(), version);
    872       // It's unwise to call dlclose() here, but we can mark it
    873       // as bad and ensure that future load attempts will fail.
    874       // We don't know how far JNI_OnLoad got, so there could
    875       // be some partially-initialized stuff accessible through
    876       // newly-registered native method calls.  We could try to
    877       // unregister them, but that doesn't seem worthwhile.
    878     } else {
    879       was_successful = true;
    880     }
    881     VLOG(jni) << "[Returned " << (was_successful ? "successfully" : "failure")
    882               << " from JNI_OnLoad in \"" << path << "\"]";
    883   }
    884 
    885   library->SetResult(was_successful);
    886   return was_successful;
    887 }
    888 
    889 void* JavaVMExt::FindCodeForNativeMethod(ArtMethod* m) {
    890   CHECK(m->IsNative());
    891   mirror::Class* c = m->GetDeclaringClass();
    892   // If this is a static method, it could be called before the class has been initialized.
    893   CHECK(c->IsInitializing()) << c->GetStatus() << " " << PrettyMethod(m);
    894   std::string detail;
    895   void* native_method;
    896   Thread* self = Thread::Current();
    897   {
    898     MutexLock mu(self, *Locks::jni_libraries_lock_);
    899     native_method = libraries_->FindNativeMethod(m, detail);
    900   }
    901   // Throwing can cause libraries_lock to be reacquired.
    902   if (native_method == nullptr) {
    903     self->ThrowNewException("Ljava/lang/UnsatisfiedLinkError;", detail.c_str());
    904   }
    905   return native_method;
    906 }
    907 
    908 void JavaVMExt::SweepJniWeakGlobals(IsMarkedVisitor* visitor) {
    909   MutexLock mu(Thread::Current(), weak_globals_lock_);
    910   Runtime* const runtime = Runtime::Current();
    911   for (auto* entry : weak_globals_) {
    912     // Need to skip null here to distinguish between null entries and cleared weak ref entries.
    913     if (!entry->IsNull()) {
    914       // Since this is called by the GC, we don't need a read barrier.
    915       mirror::Object* obj = entry->Read<kWithoutReadBarrier>();
    916       mirror::Object* new_obj = visitor->IsMarked(obj);
    917       if (new_obj == nullptr) {
    918         new_obj = runtime->GetClearedJniWeakGlobal();
    919       }
    920       *entry = GcRoot<mirror::Object>(new_obj);
    921     }
    922   }
    923 }
    924 
    925 void JavaVMExt::TrimGlobals() {
    926   WriterMutexLock mu(Thread::Current(), globals_lock_);
    927   globals_.Trim();
    928 }
    929 
    930 void JavaVMExt::VisitRoots(RootVisitor* visitor) {
    931   Thread* self = Thread::Current();
    932   ReaderMutexLock mu(self, globals_lock_);
    933   globals_.VisitRoots(visitor, RootInfo(kRootJNIGlobal));
    934   // The weak_globals table is visited by the GC itself (because it mutates the table).
    935 }
    936 
    937 // JNI Invocation interface.
    938 
    939 extern "C" jint JNI_CreateJavaVM(JavaVM** p_vm, JNIEnv** p_env, void* vm_args) {
    940   ScopedTrace trace(__FUNCTION__);
    941   const JavaVMInitArgs* args = static_cast<JavaVMInitArgs*>(vm_args);
    942   if (IsBadJniVersion(args->version)) {
    943     LOG(ERROR) << "Bad JNI version passed to CreateJavaVM: " << args->version;
    944     return JNI_EVERSION;
    945   }
    946   RuntimeOptions options;
    947   for (int i = 0; i < args->nOptions; ++i) {
    948     JavaVMOption* option = &args->options[i];
    949     options.push_back(std::make_pair(std::string(option->optionString), option->extraInfo));
    950   }
    951   bool ignore_unrecognized = args->ignoreUnrecognized;
    952   if (!Runtime::Create(options, ignore_unrecognized)) {
    953     return JNI_ERR;
    954   }
    955 
    956   // Initialize native loader. This step makes sure we have
    957   // everything set up before we start using JNI.
    958   android::InitializeNativeLoader();
    959 
    960   Runtime* runtime = Runtime::Current();
    961   bool started = runtime->Start();
    962   if (!started) {
    963     delete Thread::Current()->GetJniEnv();
    964     delete runtime->GetJavaVM();
    965     LOG(WARNING) << "CreateJavaVM failed";
    966     return JNI_ERR;
    967   }
    968 
    969   *p_env = Thread::Current()->GetJniEnv();
    970   *p_vm = runtime->GetJavaVM();
    971   return JNI_OK;
    972 }
    973 
    974 extern "C" jint JNI_GetCreatedJavaVMs(JavaVM** vms_buf, jsize buf_len, jsize* vm_count) {
    975   Runtime* runtime = Runtime::Current();
    976   if (runtime == nullptr || buf_len == 0) {
    977     *vm_count = 0;
    978   } else {
    979     *vm_count = 1;
    980     vms_buf[0] = runtime->GetJavaVM();
    981   }
    982   return JNI_OK;
    983 }
    984 
    985 // Historically unsupported.
    986 extern "C" jint JNI_GetDefaultJavaVMInitArgs(void* /*vm_args*/) {
    987   return JNI_ERR;
    988 }
    989 
    990 }  // namespace art
    991