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;