-
Notifications
You must be signed in to change notification settings - Fork 589
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Bridgeless Mode support (New Architecture) [0.74] #1769
Comments
Have you been able to make it work even with the bridge on 74? On Android there is no longer |
@radex do you think you can take a look at this to solve the breaking change introduced by RN 74 ? |
|
@angelo-hub Any progress on this one? |
@enahum Is there any progress on this issue? I have the same problem. |
@radex any plan for new arch? |
@radex Can we get an answer in this thread? |
Yes, sorry for staying quiet about it. Yes, I'm planning to work on this likely in August. |
Hey @radex - I am happy to help with chores and low hanging fruit re new architecture support. Not my area of expertise but if there is a pull request I will contribute |
I'm happy to help too |
I got it working on 0.74.5 (with bridge) with this patch, it reverts the deprecation and removes BridgelessCatalystInstance.kt. It might be possible to do the same with 0.75, but it will be more difficult because there they actually removed the JSIModule stuff. I might try it later though Be sure to enable building from source on Android (android/settings.gradle): includeBuild('../node_modules/react-native') {
dependencySubstitution {
substitute(module("com.facebook.react:react-android")).using(project(":packages:react-native:ReactAndroid"))
substitute(module("com.facebook.react:react-native")).using(project(":packages:react-native:ReactAndroid"))
substitute(module("com.facebook.react:hermes-android")).using(project(":packages:react-native:ReactAndroid:hermes-engine"))
substitute(module("com.facebook.react:hermes-engine")).using(project(":packages:react-native:ReactAndroid:hermes-engine"))
}
} The patch:
Really frustrating that the RN changelog mentions that this was unused in open source, idk how they missed this huge repo |
@radex Could you update how you see the progress of this work? We're trying to get the app ready for the new architecture as of version 0.76 and are looking for issues among the key libraries. Without watermelonDB it probably won't be possible, so any information about the progress/plans would be super valuable. Maybe someone advanced from the community would be able to help solve some problems. |
Hi, Any update on solution for this? |
WatermelonDB JSI module can be registered like this in React Native 0.74+: MainApplication.kt import others....
import com.facebook.react.ReactInstanceManager
import com.nozbe.watermelondb.jsi.JSIInstaller
import com.facebook.react.bridge.ReactContext
import com.facebook.react.bridge.UiThreadUtil
class MainApplication : Application(), ReactApplication {
....
private var listenerAdded = false
override fun onCreate() {
super.onCreate()
....
registerJSIModules()
}
private fun runOnJSQueueThread(action: () -> Unit) {
reactNativeHost.reactInstanceManager.currentReactContext?.runOnJSQueueThread {
action()
} ?: UiThreadUtil.runOnUiThread {
reactNativeHost.reactInstanceManager.currentReactContext?.runOnJSQueueThread {
action()
}
}
}
@Suppress("DEPRECATION")
private fun registerJSIModules() {
val reactInstanceManager = reactNativeHost.reactInstanceManager
if (!listenerAdded) {
listenerAdded = true
reactInstanceManager.addReactInstanceEventListener(object : ReactInstanceManager.ReactInstanceEventListener {
override fun onReactContextInitialized(context: ReactContext) {
runOnJSQueueThread {
registerWatermelonJSI(context)
}
}
})
}
}
private fun registerWatermelonJSI(context: ReactContext) {
val holder = context.javaScriptContextHolder?.get()
if (holder != null) {
JSIInstaller.install(context, holder)
}
}
} A patch is also required to make JSIInstaller class and methods public. diff --git a/native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/JSIInstaller.java b/native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/JSIInstaller.java
index 055cede2f20cd6a75ffb79d156e35396c1438c91..fb7ca33847aa9ad1349b10b35d4e27575e843479 100755
--- a/native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/JSIInstaller.java
+++ b/native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/JSIInstaller.java
@@ -1,8 +1,8 @@
package com.nozbe.watermelondb.jsi;
import android.content.Context;
-class JSIInstaller {
- static void install(Context context, long javaScriptContextHolder) {
+public class JSIInstaller {
+ public static void install(Context context, long javaScriptContextHolder) {
JSIInstaller.context = context;
new JSIInstaller().installBinding(javaScriptContextHolder);
Didn't get the time to test this, but probably should work? |
The above works, but I have not tested it with 0.75.x |
I did try the workaround above but it did not work for me.
MainApplication.kt package something.something
import android.app.Application
import android.content.res.Configuration
import com.facebook.react.PackageList
import com.facebook.react.ReactApplication
import com.facebook.react.ReactHost
import com.facebook.react.ReactNativeHost
import com.facebook.react.ReactPackage
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load
import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
import com.facebook.react.defaults.DefaultReactNativeHost
import com.facebook.soloader.SoLoader
import java.util.Arrays
import com.facebook.react.bridge.JSIModulePackage
import com.facebook.react.bridge.JSIModule
import com.facebook.react.bridge.JSIModuleSpec
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.JavaScriptContextHolder
import expo.modules.ApplicationLifecycleDispatcher
import expo.modules.ReactNativeHostWrapper
import com.nozbe.watermelondb.jsi.WatermelonDBJSIPackage
import com.facebook.react.ReactInstanceManager
import com.nozbe.watermelondb.jsi.JSIInstaller
import com.facebook.react.bridge.ReactContext
import com.facebook.react.bridge.UiThreadUtil
class MainApplication : Application(), ReactApplication {
private var listenerAdded = false
override val reactNativeHost: ReactNativeHost =
ReactNativeHostWrapper(this, object : DefaultReactNativeHost(this) {
override fun getPackages(): List<ReactPackage> =
PackageList(this).packages.apply {
// Packages that cannot be autolinked yet can be added manually here, for example:
// add(MyReactNativePackage())
}
override fun getJSMainModuleName(): String = "index"
override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
})
override val reactHost: ReactHost
get() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost)
override fun onCreate() {
super.onCreate()
SoLoader.init(this, false)
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
// If you opted-in for the New Architecture, we load the native entry point for this app.
load()
}
ApplicationLifecycleDispatcher.onApplicationCreate(this)
registerJSIModules()
}
private fun runOnJSQueueThread(action: () -> Unit) {
reactNativeHost.reactInstanceManager.currentReactContext?.runOnJSQueueThread {
action()
} ?: UiThreadUtil.runOnUiThread {
reactNativeHost.reactInstanceManager.currentReactContext?.runOnJSQueueThread {
action()
}
}
}
@Suppress("DEPRECATION")
private fun registerJSIModules() {
val reactInstanceManager = reactNativeHost.reactInstanceManager
if (!listenerAdded) {
listenerAdded = true
reactInstanceManager.addReactInstanceEventListener(object : ReactInstanceManager.ReactInstanceEventListener {
override fun onReactContextInitialized(context: ReactContext) {
runOnJSQueueThread {
registerWatermelonJSI(context)
}
}
})
}
}
private fun registerWatermelonJSI(context: ReactContext) {
val holder = context.javaScriptContextHolder?.get()
if (holder != null) {
JSIInstaller.install(context, holder)
}
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig)
}
} I also patched WatermelonDB as follows: @nozbe+watermelondb+0.27.1.patch diff --git a/node_modules/@nozbe/watermelondb/native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/JSIInstaller.java b/node_modules/@nozbe/watermelondb/native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/JSIInstaller.java
index 055cede..fb7ca33 100755
--- a/node_modules/@nozbe/watermelondb/native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/JSIInstaller.java
+++ b/node_modules/@nozbe/watermelondb/native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/JSIInstaller.java
@@ -1,8 +1,8 @@
package com.nozbe.watermelondb.jsi;
import android.content.Context;
-class JSIInstaller {
- static void install(Context context, long javaScriptContextHolder) {
+public class JSIInstaller {
+ public static void install(Context context, long javaScriptContextHolder) {
JSIInstaller.context = context;
new JSIInstaller().installBinding(javaScriptContextHolder); I have also verified that all the changes stated in JSI setup on https://watermelondb.dev/docs/Installation#android-react-native are applied. Any help will be greatly appreciated. Thank youu! :) |
@ishan-chhabra Do you have JSI enabled in your adapter? const adapter = new SQLiteAdapter({
schema,
migrations,
jsi: true,
}) |
Bridgeless Mode is going to be default in 0.74 can offer some bandwidth to migrate to bridgeless mode as this is a super cool project
The text was updated successfully, but these errors were encountered: