1diff --git a/packages/expo-modules-core/android/CMakeLists.txt b/packages/expo-modules-core/android/CMakeLists.txt
2index d710ce4f8f..3562c513b3 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 37f9d48029..2ed8dc1e09 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@@ -270,7 +274,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/Exceptions.h b/packages/expo-modules-core/android/src/main/cpp/Exceptions.h
97index 3565306601..984166f10f 100644
98--- a/packages/expo-modules-core/android/src/main/cpp/Exceptions.h
99+++ b/packages/expo-modules-core/android/src/main/cpp/Exceptions.h
100@@ -17,7 +17,7 @@ namespace expo {
101  */
102 class CodedException : public jni::JavaClass<CodedException, jni::JThrowable> {
103 public:
104-  static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/exception/CodedException;";
105+  static auto constexpr kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/exception/CodedException;";
106
107   static jni::local_ref<CodedException> create(const std::string &message);
108 };
109@@ -28,7 +28,7 @@ public:
110 class JavaScriptEvaluateException
111   : public jni::JavaClass<JavaScriptEvaluateException, CodedException> {
112 public:
113-  static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/exception/JavaScriptEvaluateException;";
114+  static auto constexpr kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/exception/JavaScriptEvaluateException;";
115
116   static jni::local_ref<JavaScriptEvaluateException> create(
117     const std::string &message,
118diff --git a/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.cpp b/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.cpp
119index ae14c3396a..c2fe1fce5f 100644
120--- a/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.cpp
121+++ b/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.cpp
122@@ -13,7 +13,7 @@ JNIFunctionBody::invoke(jni::local_ref<jni::JArrayClass<jobject>> &&args) {
123   // Because of that, it can't be cached - we will try to invoke the nonexistent method
124   // if we receive an object of a different class than the one used to obtain the method id.
125   // The only cacheable method id can be obtain from the base class.
126-  static const auto method = jni::findClassLocal("expo/modules/kotlin/jni/JNIFunctionBody")
127+  static const auto method = jni::findClassLocal("{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JNIFunctionBody")
128     ->getMethod<
129       react::ReadableNativeArray::javaobject(jni::local_ref<jni::JArrayClass<jobject>>)
130     >(
131@@ -32,7 +32,7 @@ void JNIAsyncFunctionBody::invoke(
132   // Because of that, it can't be cached - we will try to invoke the nonexistent method
133   // if we receive an object of a different class than the one used to obtain the method id.
134   // The only cacheable method id can be obtain from the base class.
135-  static const auto method = jni::findClassLocal("expo/modules/kotlin/jni/JNIAsyncFunctionBody")
136+  static const auto method = jni::findClassLocal("{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JNIAsyncFunctionBody")
137     ->getMethod<
138       void(jni::local_ref<jni::JArrayClass<jobject>>, jobject)
139     >(
140diff --git a/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.h b/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.h
141index 4d86132af1..b96eeb3303 100644
142--- a/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.h
143+++ b/packages/expo-modules-core/android/src/main/cpp/JNIFunctionBody.h
144@@ -15,7 +15,7 @@ namespace expo {
145  */
146 class JNIFunctionBody : public jni::JavaClass<JNIFunctionBody> {
147 public:
148-  static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/jni/JNIFunctionBody;";
149+  static auto constexpr kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JNIFunctionBody;";
150
151   /**
152    * Invokes a Kotlin's implementation of this function.
153@@ -34,7 +34,7 @@ public:
154  */
155 class JNIAsyncFunctionBody : public jni::JavaClass<JNIAsyncFunctionBody> {
156 public:
157-  static auto constexpr kJavaDescriptor = "Lexpo/modules/kotlin/jni/JNIAsyncFunctionBody;";
158+  static auto constexpr kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JNIAsyncFunctionBody;";
159
160   /**
161    * Invokes a Kotlin's implementation of this async function.
162diff --git a/packages/expo-modules-core/android/src/main/cpp/JSIInteropModuleRegistry.h b/packages/expo-modules-core/android/src/main/cpp/JSIInteropModuleRegistry.h
163index 32fbabd146..f94b37ee16 100644
164--- a/packages/expo-modules-core/android/src/main/cpp/JSIInteropModuleRegistry.h
165+++ b/packages/expo-modules-core/android/src/main/cpp/JSIInteropModuleRegistry.h
166@@ -25,7 +25,7 @@ namespace expo {
167 class JSIInteropModuleRegistry : public jni::HybridClass<JSIInteropModuleRegistry> {
168 public:
169   static auto constexpr
170-    kJavaDescriptor = "Lexpo/modules/kotlin/jni/JSIInteropModuleRegistry;";
171+    kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JSIInteropModuleRegistry;";
172   static auto constexpr TAG = "JSIInteropModuleRegistry";
173
174   static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
175diff --git a/packages/expo-modules-core/android/src/main/cpp/JavaScriptModuleObject.h b/packages/expo-modules-core/android/src/main/cpp/JavaScriptModuleObject.h
176index 994df84423..c22a1ec267 100644
177--- a/packages/expo-modules-core/android/src/main/cpp/JavaScriptModuleObject.h
178+++ b/packages/expo-modules-core/android/src/main/cpp/JavaScriptModuleObject.h
179@@ -28,7 +28,7 @@ class JSIInteropModuleRegistry;
180 class JavaScriptModuleObject : public jni::HybridClass<JavaScriptModuleObject> {
181 public:
182   static auto constexpr
183-    kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptModuleObject;";
184+    kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JavaScriptModuleObject;";
185   static auto constexpr TAG = "JavaScriptModuleObject";
186
187   static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
188diff --git a/packages/expo-modules-core/android/src/main/cpp/JavaScriptObject.h b/packages/expo-modules-core/android/src/main/cpp/JavaScriptObject.h
189index 1a4bd3fdb2..6ccc28b07d 100644
190--- a/packages/expo-modules-core/android/src/main/cpp/JavaScriptObject.h
191+++ b/packages/expo-modules-core/android/src/main/cpp/JavaScriptObject.h
192@@ -25,7 +25,7 @@ class JavaScriptRuntime;
193 class JavaScriptObject : public jni::HybridClass<JavaScriptObject>, JSIObjectWrapper {
194 public:
195   static auto constexpr
196-    kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptObject;";
197+    kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JavaScriptObject;";
198   static auto constexpr TAG = "JavaScriptObject";
199
200   static void registerNatives();
201diff --git a/packages/expo-modules-core/android/src/main/cpp/JavaScriptValue.h b/packages/expo-modules-core/android/src/main/cpp/JavaScriptValue.h
202index 1f016714bc..3fe3c32737 100644
203--- a/packages/expo-modules-core/android/src/main/cpp/JavaScriptValue.h
204+++ b/packages/expo-modules-core/android/src/main/cpp/JavaScriptValue.h
205@@ -23,7 +23,7 @@ class JavaScriptObject;
206 class JavaScriptValue : public jni::HybridClass<JavaScriptValue>, JSIValueWrapper {
207 public:
208   static auto constexpr
209-    kJavaDescriptor = "Lexpo/modules/kotlin/jni/JavaScriptValue;";
210+    kJavaDescriptor = "L{VERSIONED_ABI_NAME}/expo/modules/kotlin/jni/JavaScriptValue;";
211   static auto constexpr TAG = "JavaScriptValue";
212
213   static void registerNatives();
214