diff options
author | 2023-08-03 11:30:18 +0200 | |
---|---|---|
committer | 2023-08-08 15:01:51 +0000 | |
commit | 0956e8aeac7fda35fca4c5c369b615e7fb93c6e6 (patch) | |
tree | adaa8dd8367bbc0eb18e4b8a93d2d28e433419d0 | |
parent | 1aa5d121d7eb21a96f42cfd396e56bf2acdca162 (diff) |
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
-rw-r--r-- | runtime/jni/java_vm_ext.cc | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/runtime/jni/java_vm_ext.cc b/runtime/jni/java_vm_ext.cc index 7ae6c99fc6..18abd8b3ee 100644 --- a/runtime/jni/java_vm_ext.cc +++ b/runtime/jni/java_vm_ext.cc @@ -161,11 +161,11 @@ class SharedLibrary { } // 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 @@ class SharedLibrary { 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 @@ class Libraries { // 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 @@ class Libraries { 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 @@ class Libraries { 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 @@ class Libraries { } // 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 @@ class Libraries { 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 @@ bool JavaVMExt::LoadNativeLibrary(JNIEnv* env, 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; |