Pass JNICallType to NativeBridgeGetTrampoline

NativeBridge needs to know if JNI call is @CriticalNative.
More cotext here: http://go/native-bridge-critical-jni

Bug: https://issuetracker.google.com/288392666
Test: mmma art
Change-Id: I7a645292e328f07fff619c5939eb0cee330c4e56
diff --git a/runtime/jni/java_vm_ext.cc b/runtime/jni/java_vm_ext.cc
index 7ae6c99..18abd8b 100644
--- a/runtime/jni/java_vm_ext.cc
+++ b/runtime/jni/java_vm_ext.cc
@@ -161,11 +161,11 @@
   }
 
   // No mutator lock since dlsym may block for a while if another thread is doing dlopen.
-  void* FindSymbol(const std::string& symbol_name, const char* shorty = nullptr)
-      REQUIRES(!Locks::mutator_lock_) {
-    return NeedsNativeBridge()
-        ? FindSymbolWithNativeBridge(symbol_name, shorty)
-        : FindSymbolWithoutNativeBridge(symbol_name);
+  void* FindSymbol(const std::string& symbol_name,
+                   const char* shorty,
+                   android::JNICallType jni_call_type) REQUIRES(!Locks::mutator_lock_) {
+    return NeedsNativeBridge() ? FindSymbolWithNativeBridge(symbol_name, shorty, jni_call_type) :
+                                 FindSymbolWithoutNativeBridge(symbol_name);
   }
 
   // No mutator lock since dlsym may block for a while if another thread is doing dlopen.
@@ -176,12 +176,15 @@
     return dlsym(handle_, symbol_name.c_str());
   }
 
-  void* FindSymbolWithNativeBridge(const std::string& symbol_name, const char* shorty)
+  void* FindSymbolWithNativeBridge(const std::string& symbol_name,
+                                   const char* shorty,
+                                   android::JNICallType jni_call_type)
       REQUIRES(!Locks::mutator_lock_) {
     CHECK(NeedsNativeBridge());
 
     uint32_t len = 0;
-    return android::NativeBridgeGetTrampoline(handle_, symbol_name.c_str(), shorty, len);
+    return android::NativeBridgeGetTrampoline2(
+        handle_, symbol_name.c_str(), shorty, len, jni_call_type);
   }
 
  private:
@@ -283,6 +286,8 @@
     // TODO: Avoid calling GetShorty here to prevent dirtying dex pages?
     const char* shorty = m->GetShorty();
     void* native_code = nullptr;
+    android::JNICallType jni_call_type =
+        m->IsCriticalNative() ? android::kJNICallTypeCriticalNative : android::kJNICallTypeRegular;
     if (can_suspend) {
       // Go to suspended since dlsym may block for a long time if other threads are using dlopen.
       ScopedThreadSuspension sts(self, ThreadState::kNative);
@@ -290,13 +295,15 @@
                                              declaring_class_loader_allocator,
                                              shorty,
                                              jni_short_name,
-                                             jni_long_name);
+                                             jni_long_name,
+                                             jni_call_type);
     } else {
       native_code = FindNativeMethodInternal(self,
                                              declaring_class_loader_allocator,
                                              shorty,
                                              jni_short_name,
-                                             jni_long_name);
+                                             jni_long_name,
+                                             jni_call_type);
     }
     if (native_code != nullptr) {
       return native_code;
@@ -314,7 +321,8 @@
                                  void* declaring_class_loader_allocator,
                                  const char* shorty,
                                  const std::string& jni_short_name,
-                                 const std::string& jni_long_name)
+                                 const std::string& jni_long_name,
+                                 android::JNICallType jni_call_type)
       REQUIRES(!Locks::jni_libraries_lock_) {
     MutexLock mu(self, *Locks::jni_libraries_lock_);
     for (const auto& lib : libraries_) {
@@ -326,9 +334,9 @@
       }
       // Try the short name then the long name...
       const char* arg_shorty = library->NeedsNativeBridge() ? shorty : nullptr;
-      void* fn = library->FindSymbol(jni_short_name, arg_shorty);
+      void* fn = library->FindSymbol(jni_short_name, arg_shorty, jni_call_type);
       if (fn == nullptr) {
-        fn = library->FindSymbol(jni_long_name, arg_shorty);
+        fn = library->FindSymbol(jni_long_name, arg_shorty, jni_call_type);
       }
       if (fn != nullptr) {
         VLOG(jni) << "[Found native code for " << jni_long_name
@@ -372,7 +380,7 @@
   static void UnloadLibraries(JavaVM* vm, const std::vector<SharedLibrary*>& libraries) {
     using JNI_OnUnloadFn = void(*)(JavaVM*, void*);
     for (SharedLibrary* library : libraries) {
-      void* const sym = library->FindSymbol("JNI_OnUnload", nullptr);
+      void* const sym = library->FindSymbol("JNI_OnUnload", nullptr, android::kJNICallTypeRegular);
       if (sym == nullptr) {
         VLOG(jni) << "[No JNI_OnUnload found in \"" << library->GetPath() << "\"]";
       } else {
@@ -1092,7 +1100,7 @@
   VLOG(jni) << "[Added shared library \"" << path << "\" for ClassLoader " << class_loader << "]";
 
   bool was_successful = false;
-  void* sym = library->FindSymbol("JNI_OnLoad", nullptr);
+  void* sym = library->FindSymbol("JNI_OnLoad", nullptr, android::kJNICallTypeRegular);
   if (sym == nullptr) {
     VLOG(jni) << "[No JNI_OnLoad found in \"" << path << "\"]";
     was_successful = true;