React Native 0.81 (Expo 52) Bridgeless: C++ JSI injectie slo

Pagina: 1
Acties:

Vraag


  • AegisSystems
  • Registratie: Maart 2026
  • Laatst online: 08:32
Hoi allemaal,
​Ik zit me inmiddels al uren blind te staren op een gigantisch architectuur-probleem en ik hoop dat hier wat RN/C++ goeroes rondhangen. Ik probeer een custom C++ JSI engine in te laden in een React Native project.
​Voor de context: ik draai op Expo SDK 52 met React Native 0.81. De New Architecture en Bridgeless mode staan dus standaard aan. Mijn doel is simpelweg een eigen C++ module via JSI direct aan de JavaScript runtime te knopen.
​Na veel bloed, zweet en tranen compileert de C++ kant nu eindelijk foutloos via Ninja/Clang. Maar zodra ik de app opstart in de Android emulator, klapt hij er direct uit met een rood scherm vanuit de JS-laag:
​[runtime not ready]: Invariant Violation: TurboModuleRegistry.getEnforcing(...): 'PlatformConstants' could not be found. Verify that a module by this name is registered in the native binary.
​Voordat jullie met de standaard "heb je je cache geleegd" komen, hier is wat ik allemaal al heb geprobeerd. Eerst probeerde ik een losse library te maken, maar RN 0.81 Bridgeless eist blijkbaar dat alles via één centraal punt gaat.
​Dus ben ik de officiële RN docs gaan volgen: alles in appmodules stoppen. In mijn CMakeLists.txt gebruik ik nu project(appmodules) en voeg ik mijn sources toe via target_sources. Zelfs een oude C-file netjes geïsoleerd met C99 flags om C++20 gezeik te voorkomen. Dit compileert dus perfect tot één libappmodules.so.
​Omdat ik in appmodules zit, moest ik ook JNI_OnLoad overschrijven in een custom OnLoad.cpp. Ik heb alle RN 0.81 breaking changes netjes doorgevoerd. Dus rncore.h vervangen door FBReactNativeSpec.h, fbjni::initialize gebruikt, en de nieuwe signature van autolinking_ModuleProvider zonder jsInvoker. Mijn eigen JSI install functie roep ik daar ook aan.
​Aan de Kotlin kant in de MainActivity laad ik netjes System.loadLibrary("appmodules") en luister ik via de ReactHost naar de context om nullpointers te voorkomen.
​En ja, ik heb echt alles nucleair gecleared. gradlew clean, handmatig de build en .cxx mappen weggegooid, expo start -c voor de metro cache, en zelfs de app volledig via adb uninstall van de emulator gegooid om oude bundels uit te sluiten. Maakt niks uit, de PlatformConstants error blijft.
​Mijn theorie nu is dat Expo onder water zijn eigen magie doet met appmodules om hun core TurboModules te registreren. Doordat ik de RN docs volg en appmodules en OnLoad.cpp kaap, sloop ik blijkbaar de ongedocumenteerde Expo-initialisatie.
​Heeft iemand hier ervaring mee? Hoe injecteer je in hemelsnaam veilig een custom C++ JSI module in een Expo 52 Bridgeless omgeving zonder de interne boel van Expo om zeep te helpen? Moet dit stiekem toch via een losse shared library en heb ik het mis?
​Alle ideeën zijn welkom, ik ben er wel even klaar mee voor vandaag haha. Alvast bedankt!

Alle reacties


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Deels offtopic, maar die versie is half jaar oud, en als ik de changelogs zie lijkt het sterk op dat er elke 2 maanden flinke breaking changes zijn. En wellicht ook fixes. :) Moet je dan dan niet met rectere versie werken?

(Of afhankelijk van of het hobby of werk is, en je voorkeuren, een stabielere stack zonder v0.* gedrag.)

{signature}


  • AegisSystems
  • Registratie: Maart 2026
  • Laatst online: 08:32
Voutloos schreef op zondag 15 maart 2026 @ 10:13:
Deels offtopic, maar die versie is half jaar oud, en als ik de changelogs zie lijkt het sterk op dat er elke 2 maanden flinke breaking changes zijn. En wellicht ook fixes. :) Moet je dan dan niet met rectere versie werken?

(Of afhankelijk van of het hobby of werk is, en je voorkeuren, een stabielere stack zonder v0.* gedrag.)
dat werkt niet dit probleem zit in eerdere versie en ook de nieuwste ze hebben als ware de handleiding zelf nog niet eens geschreven daarom hoopte ik dat iemand met dezelfde ervaring een oplossing ondertussen had gevonden al.

  • Stukfruit
  • Registratie: Oktober 2007
  • Niet online
Dit wil je misschien wel helemaal niet horen, maar het is exact zo'n situatie waarmee Claude (via de gratis webinterface of via Claude Code) je binnen 15 minuten kan helpen om in ieder geval achter een deel van de oorzaak en/of oplossing te komen.

Omdat ik hier geen gegenereerde reacties mag plaatsen doe ik dit niet, maar even de tekst van je volledige startpost in Claude gooien en daarna aanvullen met "bevestig deze oplossing aan de hand van recente documentatie" geeft je genoeg informatie of ideeën :)

Dat zit wel Schnorr.