come utilizzare le librerie native a 32 bit su piattaforma Android-L a 64 bit

Ho un’applicazione Android che ho compilato con AOSP (Kitkat) come applicazione di sistema Android e funzionava bene. La mia applicazione dipende dal codice nativo compilato con Android-NDK come librerie a 32 bit. Sto copiando librerie native nella cartella libs / armeabi delle mie applicazioni Android e poi costruendo la mia applicazione Android in AOSP (ho anche modificato device.mk per copiare le mie librerie nella cartella / system / lib ). Tutto funziona perfettamente su Android Kitkat.

Quando ho effettuato il porting della mia applicazione su Android-L (piattaforma a 64 bit), non sono in grado di caricare le mie librerie native dall’applicazione Android e l’errore è simile a:

java.lang.UnsatisfiedLinkError: dlopen failed: "libfoobar.so" is 32-bit instead of 64-bit

Sto usando il seguente codice Java per caricare la libreria nativa-

  if ( ENABLE_ANDROID_INTEGRATION ) { System.load("/system/lib/libfoobar.so"); } else { System.loadLibrary("foobar"); } 

Quando sto costruendo il mio codice con AOSP, ENABLE_ANDROID_INTEGRATION è vero

Più interessante quando ho distriggersto ENABLE_ANDROID_INTEGRATION e creato la mia applicazione in Eclipse, all’esterno di AOSP come una normale applicazione “scaricabile”, quindi la mia applicazione funziona correttamente su piattaforma Android a 64 bit.

Quello che voglio sapere – come posso build la mia applicazione come un’applicazione di sistema Android nativa con librerie a 32 bit (che significa build AOSP) per la piattaforma Android a 64 bit?

Quello che ho provato – ho usato LOCAL_32_BIT_ONLY = true flag nel file Android.mk della mia applicazione Android, ma non è utile. Forse non sono pienamente consapevole di questo uso della bandiera.

Dato che sto per scadere, ho preferito postare questa domanda qui in gruppo anziché in RnD. Se qualcuno ha affrontato questo problema, per favore guida.

Saluti, Meraj

Il motivo per cui funziona quando installato come applicazione di terze parti è che durante l’installazione, il gestore pacchetti analizza l’APK e controlla se utilizza librerie native e, se viene rilevato, memorizza quali ABI hanno utilizzato (poiché installa solo librerie per un singolo ABI, quindi le informazioni su quale scelta è stata fatta devono essere memorizzate da qualche parte).

Per un’applicazione installata a livello di sistema con le librerie in / system / lib, non è chiaro che questa particolare applicazione dipenda da alcune librerie specifiche per app in / system / lib (che non sono disponibili in una versione a 64 bit in / system / lib64), quindi il gestore di pacchetti / applicazioni non può sapere che questa particolare applicazione richiede uno specifico ABI e quindi la esegue in modalità a 64 bit.

L’impostazione di LOCAL_32_BIT_ONLY probabilmente influisce solo sul fatto che debba essere compilato in modalità a 32 bit, non in quale modo debba essere eseguito.

Un vecchio (e probabilmente obsoleto) rapporto su http://www.slideshare.net/hidenorly/investigation-result-on-64-bit-support-in-aosp sembra suggerire che le librerie native per le app debbano entrare in / system / lib / apkname , ma questo non sembra essere vero su un sistema Android 5.0 attuale. Invece, le librerie sembrano essere in / system / app / appname / lib / abiname . Alcune app sembrano avere librerie native per architetture multiple (ad es. Sia “arm” che “arm64” come abiname ), mentre altre hanno solo una singola architettura (che impone l’ avvio del processo in quella modalità ABI).

Quindi penso che sia necessario modificare il meccanismo per come si installano le librerie native (hai detto che hai modificato manualmente device.mk) – Non ho familiarità con come creare le proprie app come parte di una build AOSP, ma ti consiglio cercando di esaminare le app in bundle esistenti come fanno, questo commit può essere correlato: https://android.googlesource.com/platform/packages/apps/Terminal/+/1a161f75%5E%21/

Ho lo stesso problema e ho trovato la risposta qui e qui Elimina tutte le librerie a 64 bit e lascia solo le librerie a 32 bit: In Android.mk:

 APP_API := armeabi armeabi-v7a x86 mips 

In build.gradle (Modulo: app):

 ndk { moduleName "" abiFilters "armeabi", "armeabi-v7a", "x86", "mips" } 

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

Prova questo nel tuo Android.mk LOCAL_MULTILIB: = 32