Description
Excerpt from the Android Developers Blog article, Get your apps ready for the 64-bit requirement:
[added by @hramos]
The 64-bit requirement: what it means for developers
Starting August 1, 2019:
- All new apps and app updates that include native code are required to provide 64-bit versions in addition to 32-bit versions when publishing to Google Play.
- Extension: Google Play will continue to accept 32-bit only updates to existing games that use Unity 5.6 or older until August 2021.
Starting August 1, 2021:
- Google Play will stop serving apps without 64-bit versions on 64-bit capable devices, meaning they will no longer be available in the Play Store on those devices.
- This will include games built with Unity 5.6 or older.
The requirement does not apply to:
- APKs or app bundles explicitly targeting Wear OS or Android TV, which are form factors that do not currently support 64-bit code.
- APKs or app bundles that are not distributed to devices running Android 9 Pie or later.
Original Issue
Hey, it appears that React Native on Android doesn't provide a 64-bit version of the libreactnativejni.so
native library, which can cause compatibility issues on 64-bit devices. I ran into this while attempting to integrate React Native with a large existing application I'm developing.
Steps to reproduce:
- Create a new application with
react-native init
. - In the "android/app/build.gradle" file, add
compile 'io.realm:realm-android:0.82.2'
to the end of thedependencies {}
block. (Note that I don't think this is an issue specifically caused by Realm, it's just an example dependency with a 64-bit native library). - Attempt to run on a Nexus 9.
Stack trace:
E/AndroidRuntime(32171): FATAL EXCEPTION: main
E/AndroidRuntime(32171): Process: com.androidemberall, PID: 32171
E/AndroidRuntime(32171): java.lang.UnsatisfiedLinkError: could find DSO to load: libreactnativejni.so
E/AndroidRuntime(32171): at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:213)
E/AndroidRuntime(32171): at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:178)
E/AndroidRuntime(32171): at com.facebook.react.bridge.JSCJavaScriptExecutor.<clinit>(JSCJavaScriptExecutor.java:19)
...
I believe this to be caused by the shared library loading logic explained in this answer on StackOverflow. Since Realm includes a 64-bit native binary, the system no longer automatically falls back to the 32-bit version of libreactnativejni.so
provided by React.
This bug is blocking me from integrating React Native into my existing application, which I'm really excited to try!