Use 32-bit jni libraries on 64-bit android

I’ve tried running an application using a native library on the Nexus 9.

The application exits with an error message:

  • Trouble configuration of mockito with eclipse. Gives error: java.lang.verifyError
  • Android/Crashlytics NoClassDefFoundError for com.crashlytics.android.beta.Beta at runtime
  • How to run (not only install) an android application using .apk file?
  • Visual Studio Emulator for Android - Install Gapps (Google Play Services)
  • How to resume activity instead of restart when going “up” from action bar
  • Android drag and return to previous activity like Facebook and Google Photos
  • java.lang.UnsatisfiedLinkError: dlopen failed: "lib_xyz.so" is 32-bit instead of 64-bit
    

    Is there any known workaround for this problem (except, of course, recompiling the library and making the apk bigger)?

    Related posts:

    android asynctask sending callbacks to ui
    check whether lock was enabled or not
    Error:failed to find Build Tools revision 23.0.0 rc3
    android camera: onActivityResult() intent is null if it had extras
    How to get frequency from fft result?
    Android: how to log all Activity methods calls?
  • Squashed icons in toolbar after change to Android SDK 26
  • Auto-size zoom on Google Maps in java? (depending android screen resolution)
  • How to set corner radiuses for the button in java code?
  • How to hide “Navigation” and “GPS Pointer” buttons when I click the marker on the android google map
  • How to exclude transitive dependencies of other subproject in multiproject builds?
  • How to add an image to the “drawable” folder in Android Studio?
  • 5 Solutions collect form web for “Use 32-bit jni libraries on 64-bit android”

    Found an explanation: 64-bit Android can use 32-bit native libraries as a fallback, only if System.loadlLibrary() can’t find anything better in the default search path.
    You get an UnsatisfiedLinkError if you force the system to load the 32-bit library using System.load() with the full library path.
    So the first workaround is using System.loadLibrary() instead of System.load().

    An additional thing that has to be taken into account is that libraries cannot be mixed: the fallback behaviour only applies for the first library your application loads. If the first one is 64-bit, no 32-bit libraries can be loaded by the same application, and vice versa.

    the point is to convert the run environment to 32 bit

    1. add the follow content into ‘build.gradle’ ‘defaultConfig’:
      ndk {abiFilters “armeabi”, “armeabi-v7a”, “x86”, “mips” }
    2. add android.useDeprecatedNdk=true into gradle.properties
    3. add new folder named armeabi under the libs, then copy a 32bit “.so” file
      into the new folder

    https://source.android.com/source/64-bit-builds.html

    Try this in you Android.mk

    LOCAL_MULTILIB := 32
    

    Nop, you need to get the native library to be compatible with 64-bit for it to work.

    See official documentation: JNI Tips: 64-bit Considerations

    I encountered the same issue, when I did the update from Android Studio 2.1 to 2.2.3 (with ndk v.13.1), and no tips found in google really helped me (like using abiFilters, exclude ‘lib/x86_64/lib….so’, LOCAL_MULTILIB := 32, or TARGET_PREFER_32_BIT := true, …).

    Finally, I was able to make it worked again with the latest AS v2.2.3 (without changing anything in Android.mk or in build.gradle), just by using my previous ndk compiler, i.e. android-ndk-r10e

    I built the library manually with ndk-build for “armeabi-v7a” and “x86” only, and it worked like a charm on Android with arm64.

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.