1diff --git a/packages/expo-modules-core/android/CMakeLists.txt b/packages/expo-modules-core/android/CMakeLists.txt
2index 7e69193064..64cd01f802 100644
3--- a/packages/expo-modules-core/android/CMakeLists.txt
4+++ b/packages/expo-modules-core/android/CMakeLists.txt
5@@ -5,7 +5,7 @@ project(expo-modules-core)
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 set(ignoreMe "${PROJECT_BUILD_DIR} ${REACT_ANDROID_BUILD_DIR} ${REACT_ANDROID_DIR}")
13
14@@ -92,14 +92,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@@ -114,35 +114,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 194f8ac980..8ceda7036e 100644
74--- a/packages/expo-modules-core/android/build.gradle
75+++ b/packages/expo-modules-core/android/build.gradle
76@@ -59,6 +59,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@@ -326,7 +330,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/fabric/FabricComponentsRegistry.h b/packages/expo-modules-core/android/src/fabric/FabricComponentsRegistry.h
97index aaee960b00..53bbbe02b6 100644
98--- a/packages/expo-modules-core/android/src/fabric/FabricComponentsRegistry.h
99+++ b/packages/expo-modules-core/android/src/fabric/FabricComponentsRegistry.h
100@@ -9,7 +9,7 @@ namespace expo {
101 class FabricComponentsRegistry : public facebook::jni::HybridClass<FabricComponentsRegistry> {
102 public:
103   static auto constexpr
104-    kJavaDescriptor = "Lexpo/modules/adapters/react/FabricComponentsRegistry;";
105+    kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/adapters/react/FabricComponentsRegistry;";
106
107   static void registerNatives();
108
109diff --git a/packages/expo-modules-core/android/src/main/cpp/Exceptions.h b/packages/expo-modules-core/android/src/main/cpp/Exceptions.h
110index 607ed5c2b9..97684053ea 100644
111--- a/packages/expo-modules-core/android/src/main/cpp/Exceptions.h
112+++ b/packages/expo-modules-core/android/src/main/cpp/Exceptions.h
113@@ -24,7 +24,7 @@ class JSIInteropModuleRegistry;
114  */
115 class CodedException : public jni::JavaClass<CodedException, jni::JThrowable> {
116 public:
117-  static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/exception/CodedException;";
118+  static auto constexpr kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/exception/CodedException;";
119
120   static jni::local_ref<CodedException> create(const std::string &message);
121
122@@ -39,7 +39,7 @@ public:
123 class JavaScriptEvaluateException
124   : public jni::JavaClass<JavaScriptEvaluateException, CodedException> {
125 public:
126-  static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/exception/JavaScriptEvaluateException;";
127+  static auto constexpr kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/exception/JavaScriptEvaluateException;";
128
129   static jni::local_ref<JavaScriptEvaluateException> create(
130     const std::string &message,
131@@ -53,7 +53,7 @@ public:
132 class UnexpectedException
133   : public jni::JavaClass<UnexpectedException, CodedException> {
134 public:
135-  static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/exception/UnexpectedException;";
136+  static auto constexpr kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/exception/UnexpectedException;";
137
138   static jni::local_ref<UnexpectedException> create(
139     const std::string &message
140diff --git a/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.cpp b/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.cpp
141index 53629da616..2ea542bb2d 100644
142--- a/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.cpp
143+++ b/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.cpp
144@@ -14,10 +14,10 @@ JNIFunctionBody::invoke(jobjectArray args) {
145   // Because of that, it can't be cached - we will try to invoke the nonexistent method
146   // if we receive an object of a different class than the one used to obtain the method id.
147   // The only cacheable method id can be obtain from the base class.
148-  static const auto method = jni::findClassLocal("expo/modules/kotlin/jni/JNIFunctionBody")
149+  static const auto method = jni::findClassLocal("{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JNIFunctionBody")
150     ->getMethod<jni::local_ref<react::ReadableNativeArray::javaobject>(jobjectArray)>(
151       "invoke",
152-      "([Ljava/lang/Object;)Lcom/facebook/react/bridge/ReadableNativeArray;"
153+      "([Ljava/lang/Object;)L{VERSIONED_ABI_NAME}/com/facebook/react/bridge/ReadableNativeArray;"
154     );
155
156   return method(this->self(), args);
157@@ -32,7 +32,7 @@ void JNIAsyncFunctionBody::invoke(
158   // Because of that, it can't be cached - we will try to invoke the nonexistent method
159   // if we receive an object of a different class than the one used to obtain the method id.
160   // The only cacheable method id can be obtain from the base class.
161-  static const auto method = jni::findClassLocal("expo/modules/kotlin/jni/JNIAsyncFunctionBody")
162+  static const auto method = jni::findClassLocal("{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JNIAsyncFunctionBody")
163     ->getMethod<
164       void(jobjectArray , jobject)
165     >(
166diff --git a/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.h b/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.h
167index 9125e980ee..a5a7b37fbb 100644
168--- a/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.h
169+++ b/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.h
170@@ -15,7 +15,7 @@ namespace expo {
171  */
172 class JNIFunctionBody : public jni::JavaClass<JNIFunctionBody> {
173 public:
174-  static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/jni/JNIFunctionBody;";
175+  static auto constexpr kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JNIFunctionBody;";
176
177   /**
178    * Invokes a Kotlin's implementation of this function.
179@@ -34,7 +34,7 @@ public:
180  */
181 class JNIAsyncFunctionBody : public jni::JavaClass<JNIAsyncFunctionBody> {
182 public:
183-  static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/jni/JNIAsyncFunctionBody;";
184+  static auto constexpr kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JNIAsyncFunctionBody;";
185
186   /**
187    * Invokes a Kotlin's implementation of this async function.
188diff --git a/packages/expo-modules-core/android/src/main/cpp/JSIInteropModuleRegistry.h b/packages/expo-modules-core/android/src/main/cpp/JSIInteropModuleRegistry.h
189index ebd5c60547..c469341691 100644
190--- a/packages/expo-modules-core/android/src/main/cpp/JSIInteropModuleRegistry.h
191+++ b/packages/expo-modules-core/android/src/main/cpp/JSIInteropModuleRegistry.h
192@@ -27,7 +27,7 @@ namespace expo {
193 class JSIInteropModuleRegistry : public jni::HybridClass<JSIInteropModuleRegistry> {
194 public:
195   static auto constexpr
196-    kJavaDescriptor = "Lexpo/modules/kotlin/jni/JSIInteropModuleRegistry;";
197+    kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JSIInteropModuleRegistry;";
198   static auto constexpr TAG = "JSIInteropModuleRegistry";
199
200   static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
201diff --git a/packages/expo-modules-core/android/src/main/cpp/JavaReferencesCache.cpp b/packages/expo-modules-core/android/src/main/cpp/JavaReferencesCache.cpp
202index 21ea310271..43db4e425c 100644
203--- a/packages/expo-modules-core/android/src/main/cpp/JavaReferencesCache.cpp
204+++ b/packages/expo-modules-core/android/src/main/cpp/JavaReferencesCache.cpp
205@@ -25,8 +25,8 @@ void JavaReferencesCache::loadJClasses(JNIEnv *env) {
206     {"<init>", "(F)V"}
207   });
208
209-  loadJClass(env, "com/facebook/react/bridge/PromiseImpl", {
210-    {"<init>", "(Lcom/facebook/react/bridge/Callback;Lcom/facebook/react/bridge/Callback;)V"}
211+  loadJClass(env, "{VERSIONED_ABI_NAME}/com/facebook/react/bridge/PromiseImpl", {
212+    {"<init>", "(L{VERSIONED_ABI_NAME}/com/facebook/react/bridge/Callback;L{VERSIONED_ABI_NAME}/com/facebook/react/bridge/Callback;)V"}
213   });
214
215   loadJClass(env, "java/lang/Object", {});
216diff --git a/packages/expo-modules-core/android/src/main/cpp/JavaScriptModuleObject.h b/packages/expo-modules-core/android/src/main/cpp/JavaScriptModuleObject.h
217index 4b1a65ecab..49d5a841db 100644
218--- a/packages/expo-modules-core/android/src/main/cpp/JavaScriptModuleObject.h
219+++ b/packages/expo-modules-core/android/src/main/cpp/JavaScriptModuleObject.h
220@@ -29,7 +29,7 @@ class JSIInteropModuleRegistry;
221 class JavaScriptModuleObject : public jni::HybridClass<JavaScriptModuleObject> {
222 public:
223   static auto constexpr
224-    kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptModuleObject;";
225+    kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JavaScriptModuleObject;";
226   static auto constexpr TAG = "JavaScriptModuleObject";
227
228   static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
229diff --git a/packages/expo-modules-core/android/src/main/cpp/JavaScriptObject.h b/packages/expo-modules-core/android/src/main/cpp/JavaScriptObject.h
230index cebef459cb..2a92503c3b 100644
231--- a/packages/expo-modules-core/android/src/main/cpp/JavaScriptObject.h
232+++ b/packages/expo-modules-core/android/src/main/cpp/JavaScriptObject.h
233@@ -24,7 +24,7 @@ class JavaScriptValue;
234 class JavaScriptObject : public jni::HybridClass<JavaScriptObject>, JSIObjectWrapper {
235 public:
236   static auto constexpr
237-    kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptObject;";
238+    kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JavaScriptObject;";
239   static auto constexpr TAG = "JavaScriptObject";
240
241   static void registerNatives();
242diff --git a/packages/expo-modules-core/android/src/main/cpp/JavaScriptTypedArray.h b/packages/expo-modules-core/android/src/main/cpp/JavaScriptTypedArray.h
243index 099e2f6728..10f8fee8cd 100644
244--- a/packages/expo-modules-core/android/src/main/cpp/JavaScriptTypedArray.h
245+++ b/packages/expo-modules-core/android/src/main/cpp/JavaScriptTypedArray.h
246@@ -20,7 +20,7 @@ namespace jsi = facebook::jsi;
247 class JavaScriptTypedArray : public jni::HybridClass<JavaScriptTypedArray, JavaScriptObject> {
248 public:
249   static auto constexpr
250-    kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptTypedArray;";
251+    kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JavaScriptTypedArray;";
252   static auto constexpr TAG = "JavaScriptTypedArray";
253
254   static void registerNatives();
255diff --git a/packages/expo-modules-core/android/src/main/cpp/JavaScriptValue.h b/packages/expo-modules-core/android/src/main/cpp/JavaScriptValue.h
256index 506176ccba..fe9a0df850 100644
257--- a/packages/expo-modules-core/android/src/main/cpp/JavaScriptValue.h
258+++ b/packages/expo-modules-core/android/src/main/cpp/JavaScriptValue.h
259@@ -27,7 +27,7 @@ class JavaScriptTypedArray;
260 class JavaScriptValue : public jni::HybridClass<JavaScriptValue>, JSIValueWrapper {
261 public:
262   static auto constexpr
263-    kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptValue;";
264+    kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JavaScriptValue;";
265   static auto constexpr TAG = "JavaScriptValue";
266
267   static void registerNatives();
268diff --git a/packages/expo-modules-core/android/src/main/cpp/MethodMetadata.cpp b/packages/expo-modules-core/android/src/main/cpp/MethodMetadata.cpp
269index 3478452a60..2fa4354727 100644
270--- a/packages/expo-modules-core/android/src/main/cpp/MethodMetadata.cpp
271+++ b/packages/expo-modules-core/android/src/main/cpp/MethodMetadata.cpp
272@@ -323,10 +323,10 @@ jsi::Function MethodMetadata::createPromiseBody(
273       JNIEnv *env = jni::Environment::current();
274
275       auto &jPromise = JavaReferencesCache::instance()->getJClass(
276-        "com/facebook/react/bridge/PromiseImpl");
277+        "{VERSIONED_ABI_NAME}/com/facebook/react/bridge/PromiseImpl");
278       jmethodID jPromiseConstructor = jPromise.getMethod(
279         "<init>",
280-        "(Lcom/facebook/react/bridge/Callback;Lcom/facebook/react/bridge/Callback;)V"
281+        "(L{VERSIONED_ABI_NAME}/com/facebook/react/bridge/Callback;L{VERSIONED_ABI_NAME}/com/facebook/react/bridge/Callback;)V"
282       );
283
284       // Creates a promise object
285diff --git a/packages/expo-modules-core/android/src/main/cpp/types/ExpectedType.h b/packages/expo-modules-core/android/src/main/cpp/types/ExpectedType.h
286index 9a722a051e..93c60369fc 100644
287--- a/packages/expo-modules-core/android/src/main/cpp/types/ExpectedType.h
288+++ b/packages/expo-modules-core/android/src/main/cpp/types/ExpectedType.h
289@@ -14,7 +14,7 @@ namespace expo {
290  */
291 class SingleType : public jni::JavaClass<SingleType> {
292   static auto constexpr
293-    kJavaDescriptor = "Lexpo/modules/kotlin/jni/SingleType;";
294+    kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/SingleType;";
295 };
296
297 /**
298@@ -23,7 +23,7 @@ class SingleType : public jni::JavaClass<SingleType> {
299 class ExpectedType : public jni::JavaClass<ExpectedType> {
300 public:
301   static auto constexpr
302-    kJavaDescriptor = "Lexpo/modules/kotlin/jni/ExpectedType;";
303+    kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/ExpectedType;";
304
305   CppType getCombinedTypes();
306 };
307