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