1diff --git a/packages/expo-modules-core/android/CMakeLists.txt b/packages/expo-modules-core/android/CMakeLists.txt 2index d710ce4f8f..305e29f6c4 100644 3--- a/packages/expo-modules-core/android/CMakeLists.txt 4+++ b/packages/expo-modules-core/android/CMakeLists.txt 5@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.4.1) 6 set(CMAKE_VERBOSE_MAKEFILE ON) 7 set(CMAKE_ANDROID_STL_TYPE c++_shared) 8 set(CMAKE_CXX_STANDARD 17) 9-set(PACKAGE_NAME "expo-modules-core") 10+set(PACKAGE_NAME "expo-modules-core_{VERSIONED_ABI_NAME}") 11 set(BUILD_DIR ${CMAKE_SOURCE_DIR}/build) 12 13 if (${NATIVE_DEBUG}) 14@@ -61,14 +61,14 @@ find_library(LOG_LIB log) 15 if(${REACT_NATIVE_TARGET_VERSION} LESS 69) 16 find_library( 17 FOLLY_LIB 18- folly_json 19+ folly_json_{VERSIONED_ABI_NAME} 20 PATHS ${LIBRN_DIR} 21 NO_CMAKE_FIND_ROOT_PATH 22 ) 23 else() 24 find_library( 25 FOLLY_LIB 26- folly_runtime 27+ folly_runtime_{VERSIONED_ABI_NAME} 28 PATHS ${LIBRN_DIR} 29 NO_CMAKE_FIND_ROOT_PATH 30 ) 31@@ -83,35 +83,35 @@ find_library( 32 33 find_library( 34 JSI_LIB 35- jsi 36+ jsi_{VERSIONED_ABI_NAME} 37 PATHS ${LIBRN_DIR} 38 NO_CMAKE_FIND_ROOT_PATH 39 ) 40 41 find_library( 42 REACT_NATIVE_JNI_LIB 43- reactnativejni 44+ reactnativejni_{VERSIONED_ABI_NAME} 45 PATHS ${LIBRN_DIR} 46 NO_CMAKE_FIND_ROOT_PATH 47 ) 48 49 find_library( 50 REACT_NATIVE_MODULES_CORE 51- react_nativemodule_core 52+ react_nativemodule_core_{VERSIONED_ABI_NAME} 53 PATHS ${LIBRN_DIR} 54 NO_CMAKE_FIND_ROOT_PATH 55 ) 56 57 find_library( 58 HERMES_LIB 59- hermes 60+ hermes_{VERSIONED_ABI_NAME} 61 PATHS ${HERMES_SO_DIR} 62 NO_CMAKE_FIND_ROOT_PATH 63 ) 64 65 find_library( 66 JSEXECUTOR_LIB 67- jscexecutor 68+ jscexecutor_{VERSIONED_ABI_NAME} 69 PATHS ${LIBRN_DIR} 70 NO_CMAKE_FIND_ROOT_PATH 71 ) 72diff --git a/packages/expo-modules-core/android/build.gradle b/packages/expo-modules-core/android/build.gradle 73index 2a9aecc5ee..ee62584679 100644 74--- a/packages/expo-modules-core/android/build.gradle 75+++ b/packages/expo-modules-core/android/build.gradle 76@@ -55,6 +55,10 @@ def REACT_NATIVE_DIR = REACT_NATIVE_BUILD_FROM_SOURCE 77 def REACT_NATIVE_SO_DIR = REACT_NATIVE_BUILD_FROM_SOURCE 78 ? Paths.get(findProject(":ReactAndroid").getProjectDir().toString(), "build", "intermediates", "library_*", "*", "jni") 79 : "${buildDir}/react-native-0*/jni" 80+REACT_NATIVE_DIR = "${rootDir}/versioned-react-native" 81+REACT_NATIVE_BUILD_FROM_SOURCE = false 82+REACT_NATIVE_SO_DIR = "${buildDir}/reactandroid-{VERSIONED_ABI_NAME}-*/jni" 83+def REACT_NATIVE_AAR_DIR = "${rootDir}/versioned-abis/expoview-{VERSIONED_ABI_NAME}/maven" 84 85 def reactProperties = new Properties() 86 file("$REACT_NATIVE_DIR/ReactAndroid/gradle.properties").withInputStream { reactProperties.load(it) } 87@@ -290,7 +294,7 @@ task createNativeDepsDirectories() { 88 // JNI 89 def extractReactNativeAAR = { buildType -> 90 def suffix = buildType == 'Debug' ? '-debug' : '-release' 91- def rnAARs = fileTree(REACT_NATIVE_DIR).matching { include "**/react-native/**/*${suffix}.aar" } 92+ def rnAARs = fileTree(REACT_NATIVE_AAR_DIR).matching { include "**/*.aar" } 93 if (rnAARs.isEmpty()) { 94 rnAARs = fileTree(REACT_NATIVE_DIR).matching { include "**/react-native/**/*.aar" } 95 } 96diff --git a/packages/expo-modules-core/android/src/main/cpp/CachedReferencesRegistry.cpp b/packages/expo-modules-core/android/src/main/cpp/CachedReferencesRegistry.cpp 97index 6a92150cef..c656ead0e1 100644 98--- a/packages/expo-modules-core/android/src/main/cpp/CachedReferencesRegistry.cpp 99+++ b/packages/expo-modules-core/android/src/main/cpp/CachedReferencesRegistry.cpp 100@@ -19,8 +19,8 @@ void CachedReferencesRegistry::loadJClasses(JNIEnv *env) { 101 {"<init>", "(Z)V"} 102 }); 103 104- loadJClass(env, "com/facebook/react/bridge/PromiseImpl", { 105- {"<init>", "(Lcom/facebook/react/bridge/Callback;Lcom/facebook/react/bridge/Callback;)V"} 106+ loadJClass(env, "{VERSIONED_ABI_NAME}/com/facebook/react/bridge/PromiseImpl", { 107+ {"<init>", "(L{VERSIONED_ABI_NAME}/com/facebook/react/bridge/Callback;L{VERSIONED_ABI_NAME}/com/facebook/react/bridge/Callback;)V"} 108 }); 109 110 loadJClass(env, "java/lang/Object", {}); 111diff --git a/packages/expo-modules-core/android/src/main/cpp/Exceptions.h b/packages/expo-modules-core/android/src/main/cpp/Exceptions.h 112index 3565306601..f1773f0ae3 100644 113--- a/packages/expo-modules-core/android/src/main/cpp/Exceptions.h 114+++ b/packages/expo-modules-core/android/src/main/cpp/Exceptions.h 115@@ -17,7 +17,7 @@ namespace expo { 116 */ 117 class CodedException : public jni::JavaClass<CodedException, jni::JThrowable> { 118 public: 119- static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/exception/CodedException;"; 120+ static auto constexpr kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/exception/CodedException;"; 121 122 static jni::local_ref<CodedException> create(const std::string &message); 123 }; 124@@ -28,7 +28,7 @@ public: 125 class JavaScriptEvaluateException 126 : public jni::JavaClass<JavaScriptEvaluateException, CodedException> { 127 public: 128- static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/exception/JavaScriptEvaluateException;"; 129+ static auto constexpr kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/exception/JavaScriptEvaluateException;"; 130 131 static jni::local_ref<JavaScriptEvaluateException> create( 132 const std::string &message, 133diff --git a/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.cpp b/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.cpp 134index d9ac4a3361..61c6d766bd 100644 135--- a/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.cpp 136+++ b/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.cpp 137@@ -14,10 +14,10 @@ JNIFunctionBody::invoke(jobjectArray args) { 138 // Because of that, it can't be cached - we will try to invoke the nonexistent method 139 // if we receive an object of a different class than the one used to obtain the method id. 140 // The only cacheable method id can be obtain from the base class. 141- static const auto method = jni::findClassLocal("expo/modules/kotlin/jni/JNIFunctionBody") 142+ static const auto method = jni::findClassLocal("{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JNIFunctionBody") 143 ->getMethod<jni::local_ref<react::ReadableNativeArray::javaobject>(jobjectArray)>( 144 "invoke", 145- "([Ljava/lang/Object;)Lcom/facebook/react/bridge/ReadableNativeArray;" 146+ "([Ljava/lang/Object;)L{VERSIONED_ABI_NAME}/com/facebook/react/bridge/ReadableNativeArray;" 147 ); 148 149 return method(this->self(), args); 150@@ -32,7 +32,7 @@ void JNIAsyncFunctionBody::invoke( 151 // Because of that, it can't be cached - we will try to invoke the nonexistent method 152 // if we receive an object of a different class than the one used to obtain the method id. 153 // The only cacheable method id can be obtain from the base class. 154- static const auto method = jni::findClassLocal("expo/modules/kotlin/jni/JNIAsyncFunctionBody") 155+ static const auto method = jni::findClassLocal("{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JNIAsyncFunctionBody") 156 ->getMethod< 157 void(jobjectArray , jobject) 158 >( 159diff --git a/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.h b/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.h 160index 9125e980ee..d0bb26ac53 100644 161--- a/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.h 162+++ b/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.h 163@@ -15,7 +15,7 @@ namespace expo { 164 */ 165 class JNIFunctionBody : public jni::JavaClass<JNIFunctionBody> { 166 public: 167- static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/jni/JNIFunctionBody;"; 168+ static auto constexpr kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JNIFunctionBody;"; 169 170 /** 171 * Invokes a Kotlin's implementation of this function. 172@@ -34,7 +34,7 @@ public: 173 */ 174 class JNIAsyncFunctionBody : public jni::JavaClass<JNIAsyncFunctionBody> { 175 public: 176- static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/jni/JNIAsyncFunctionBody;"; 177+ static auto constexpr kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JNIAsyncFunctionBody;"; 178 179 /** 180 * Invokes a Kotlin's implementation of this async function. 181diff --git a/packages/expo-modules-core/android/src/main/cpp/JSIInteropModuleRegistry.h b/packages/expo-modules-core/android/src/main/cpp/JSIInteropModuleRegistry.h 182index 32fbabd146..f249eb6017 100644 183--- a/packages/expo-modules-core/android/src/main/cpp/JSIInteropModuleRegistry.h 184+++ b/packages/expo-modules-core/android/src/main/cpp/JSIInteropModuleRegistry.h 185@@ -25,7 +25,7 @@ namespace expo { 186 class JSIInteropModuleRegistry : public jni::HybridClass<JSIInteropModuleRegistry> { 187 public: 188 static auto constexpr 189- kJavaDescriptor = "Lexpo/modules/kotlin/jni/JSIInteropModuleRegistry;"; 190+ kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JSIInteropModuleRegistry;"; 191 static auto constexpr TAG = "JSIInteropModuleRegistry"; 192 193 static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis); 194diff --git a/packages/expo-modules-core/android/src/main/cpp/JavaScriptModuleObject.h b/packages/expo-modules-core/android/src/main/cpp/JavaScriptModuleObject.h 195index 994df84423..700d19f4e3 100644 196--- a/packages/expo-modules-core/android/src/main/cpp/JavaScriptModuleObject.h 197+++ b/packages/expo-modules-core/android/src/main/cpp/JavaScriptModuleObject.h 198@@ -28,7 +28,7 @@ class JSIInteropModuleRegistry; 199 class JavaScriptModuleObject : public jni::HybridClass<JavaScriptModuleObject> { 200 public: 201 static auto constexpr 202- kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptModuleObject;"; 203+ kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JavaScriptModuleObject;"; 204 static auto constexpr TAG = "JavaScriptModuleObject"; 205 206 static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis); 207diff --git a/packages/expo-modules-core/android/src/main/cpp/JavaScriptObject.h b/packages/expo-modules-core/android/src/main/cpp/JavaScriptObject.h 208index 1a4bd3fdb2..4173fb0849 100644 209--- a/packages/expo-modules-core/android/src/main/cpp/JavaScriptObject.h 210+++ b/packages/expo-modules-core/android/src/main/cpp/JavaScriptObject.h 211@@ -25,7 +25,7 @@ class JavaScriptRuntime; 212 class JavaScriptObject : public jni::HybridClass<JavaScriptObject>, JSIObjectWrapper { 213 public: 214 static auto constexpr 215- kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptObject;"; 216+ kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JavaScriptObject;"; 217 static auto constexpr TAG = "JavaScriptObject"; 218 219 static void registerNatives(); 220diff --git a/packages/expo-modules-core/android/src/main/cpp/JavaScriptValue.h b/packages/expo-modules-core/android/src/main/cpp/JavaScriptValue.h 221index 1f016714bc..b501cd8faa 100644 222--- a/packages/expo-modules-core/android/src/main/cpp/JavaScriptValue.h 223+++ b/packages/expo-modules-core/android/src/main/cpp/JavaScriptValue.h 224@@ -23,7 +23,7 @@ class JavaScriptObject; 225 class JavaScriptValue : public jni::HybridClass<JavaScriptValue>, JSIValueWrapper { 226 public: 227 static auto constexpr 228- kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptValue;"; 229+ kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JavaScriptValue;"; 230 static auto constexpr TAG = "JavaScriptValue"; 231 232 static void registerNatives(); 233diff --git a/packages/expo-modules-core/android/src/main/cpp/MethodMetadata.cpp b/packages/expo-modules-core/android/src/main/cpp/MethodMetadata.cpp 234index 60e89e24f3..0875510097 100644 235--- a/packages/expo-modules-core/android/src/main/cpp/MethodMetadata.cpp 236+++ b/packages/expo-modules-core/android/src/main/cpp/MethodMetadata.cpp 237@@ -321,10 +321,10 @@ jsi::Function MethodMetadata::createPromiseBody( 238 JNIEnv *env = jni::Environment::current(); 239 240 auto &jPromise = CachedReferencesRegistry::instance()->getJClass( 241- "com/facebook/react/bridge/PromiseImpl"); 242+ "{VERSIONED_ABI_NAME}/com/facebook/react/bridge/PromiseImpl"); 243 jmethodID jPromiseConstructor = jPromise.getMethod( 244 "<init>", 245- "(Lcom/facebook/react/bridge/Callback;Lcom/facebook/react/bridge/Callback;)V" 246+ "(L{VERSIONED_ABI_NAME}/com/facebook/react/bridge/Callback;L{VERSIONED_ABI_NAME}/com/facebook/react/bridge/Callback;)V" 247 ); 248 249 // Creates a promise object 250