diff --git a/NativeScript/ffi/jni/jsi/metadata/MetadataNode.cpp b/NativeScript/ffi/jni/jsi/metadata/MetadataNode.cpp index 6187a585..65193022 100644 --- a/NativeScript/ffi/jni/jsi/metadata/MetadataNode.cpp +++ b/NativeScript/ffi/jni/jsi/metadata/MetadataNode.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "NativeScriptException.h" #include "MetadataNode.h" #include "CallbackHandlers.h" @@ -887,13 +888,14 @@ void MetadataNode::CreateTopLevelNamespaces(JsRuntime &rt) { if (IsJavascriptKeyword(nameSpace)) { nameSpace = "$" + nameSpace; } - try { - global.setProperty(rt, nameSpace.c_str(), packageObj); - } catch (JsError &) { - // A host can already own the name as a non-writable global (Expo - // defines `expo`), so fall back to the same $ prefix as keywords. - global.setProperty(rt, ("$" + nameSpace).c_str(), packageObj); + if (global.hasProperty(rt, nameSpace.c_str())) { + string fallback = "$" + nameSpace; + __android_log_print(ANDROID_LOG_WARN, "TNS.Runtime", + "Java package '%s' is exposed as '%s': the global '%s' already exists.", + nameSpace.c_str(), fallback.c_str(), nameSpace.c_str()); + nameSpace = fallback; } + global.setProperty(rt, nameSpace.c_str(), packageObj); } } } diff --git a/NativeScript/ffi/jni/napi/metadata/MetadataNode.cpp b/NativeScript/ffi/jni/napi/metadata/MetadataNode.cpp index 6e9e4821..af866da3 100644 --- a/NativeScript/ffi/jni/napi/metadata/MetadataNode.cpp +++ b/NativeScript/ffi/jni/napi/metadata/MetadataNode.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "NativeScriptException.h" #include "MetadataNode.h" #include "CallbackHandlers.h" @@ -1120,6 +1121,14 @@ void MetadataNode::CreateTopLevelNamespaces(napi_env env) { if (IsJavascriptKeyword(nameSpace)) { nameSpace = "$" + nameSpace; } + bool exists = false; + if (napi_has_named_property(env, global, nameSpace.c_str(), &exists) == napi_ok && exists) { + string fallback = "$" + nameSpace; + __android_log_print(ANDROID_LOG_WARN, "TNS.Runtime", + "Java package '%s' is exposed as '%s': the global '%s' already exists.", + nameSpace.c_str(), fallback.c_str(), nameSpace.c_str()); + nameSpace = fallback; + } NAPI_GUARD(napi_set_named_property(env, global, nameSpace.c_str(), packageObj)) {} } }