Verwenden Sie 32-Bit-Jni-Bibliotheken auf 64-Bit-Android

Ich habe versucht, eine Anwendung mit einer nativen Bibliothek auf dem Nexus 9 auszuführen.

Die Anwendung wird mit einer Fehlermeldung beendet:

  • Android Studio Emulator - Java-Instanz unterstützt nicht 32-Bit-JVM
  • Android studio adb Syntax error: ")" unerwartet
  • Android NDK - Multibib-Unterstützung mit gradle
  • Android Native - Wann soll man 64-Bit NDK verwenden?
  • Wie man Android's aapt und adb Arbeit auf 64-Bit-Ubuntu ohne ia32-libs (Werke für die Versionen 12, 13 und 14)
  • java.lang.UnsatisfiedLinkError: dlopen failed: "lib_xyz.so" is 32-bit instead of 64-bit 

    Gibt es eine bekannte Problemumgehung für dieses Problem (außer, natürlich, die Bibliothek neu zu kompilieren und die apk größer zu machen)?

  • HTTPS-Verbindung mit Client-Zertifikat in einer Android-App
  • Run-as: Könnte keine Fähigkeiten setzen: Operation nicht erlaubt
  • Gibt es eine AdMob-Dummy-ID?
  • H264 Encoder in Android?
  • Best Practice für die Speicherung von Daten im Speicher und Datenbank zur gleichen Zeit auf Android
  • Ist es möglich, adb-Befehle zu verwenden, um auf eine Ansicht zu klicken, indem sie ihre ID finden?
  • 5 Solutions collect form web for “Verwenden Sie 32-Bit-Jni-Bibliotheken auf 64-Bit-Android”

    Eine Erklärung gefunden: 64-Bit-Android kann 32-Bit-native Bibliotheken als Fallback verwenden, nur wenn System.loadlLibrary () im Default-Suchpfad nichts besseres finden kann. Sie erhalten einen unzufriedenenLinkError, wenn Sie das System zwingen, die 32-Bit-Bibliothek mit System.load () mit dem vollständigen Bibliothekspfad zu laden. Also der erste Workaround verwendet System.loadLibrary () anstelle von System.load ().

    Eine zusätzliche Sache, die berücksichtigt werden muss, ist, dass Bibliotheken nicht gemischt werden können: Das Fallback-Verhalten gilt nur für die erste Bibliothek, die Ihre Applikation lädt. Wenn das erste 64-Bit ist, können keine 32-Bit-Bibliotheken von derselben Applikation geladen werden und umgekehrt.

    Der Punkt ist, die Laufumgebung auf 32 Bit umzuwandeln

    1. Füge den folgenden Inhalt in 'build.gradle' 'defaultConfig' ein: ndk {abiFilters "armeabi", "armeabi-v7a", "x86", "mips"}
    2. Add android.useDeprecatedNdk = true in gradle.properties
    3. Füge einen neuen Ordner namens armeabi unter die libs hinzu und kopiere dann eine 32bit ".so" Datei in den neuen Ordner

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

    Versuchen Sie dies in Ihnen Android.mk

     LOCAL_MULTILIB := 32 

    Nop, du musst die native Bibliothek mit 64-Bit kompatibel machen, damit es funktioniert.

    Siehe offizielle Dokumentation: JNI Tipps: 64-Bit-Überlegungen

    Ich habe das gleiche Problem getroffen, als ich das Update von Android Studio 2.1 auf 2.2.3 (mit ndk v.13.1) gemacht habe, und keine Tipps in Google gefunden haben mir wirklich geholfen (wie mit abiFilters, ausschließen 'lib / x86_64 / lib …. So ', LOCAL_MULTILIB: = 32 oder TARGET_PREFER_32_BIT: = true, …).

    Schließlich konnte ich es wieder mit dem neuesten AS v2.2.3 (ohne irgendetwas in Android.mk oder in build.gradle) zu ändern, nur indem ich meinen vorherigen ndk compiler, dh android-ndk-r10e

    Ich baute die Bibliothek manuell mit ndk-build für "armeabi-v7a" und "x86" nur, und es funktionierte wie ein charm auf Android mit arm64.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.