8

La mia domanda è diretta allo sviluppo nativo di Android per sistemi Android a 64 bit.Supporto NDK -multlib per Android con gradle

Sto cercando un modo per configurare il supporto di librerie native compilate a 32 bit su un sistema Android a 64 bit utilizzando il sistema gradle build. Le librerie che l'applicazione dovrebbe utilizzare sono disponibili solo come build a 32 bit. Sarebbe molto dispendioso in termini di tempo e incline a portare queste librerie a 64 bit.

Quindi, voglio configurare gradle per distribuire questi binari a 32 bit pre-compilati e per utilizzare anche una versione a 32 bit dell'applicazione Android.

L'attuale configurazione porta alla seguente errore:

E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: <application_name>, PID: 2170 
    java.lang.UnsatisfiedLinkError: 
dalvik.system.PathClassLoader 
[DexPathList[[zip file "/data/app/<application_name>/base.apk"], 
nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]] 
enter code here`couldn't find "libmynativelibrary.so" 
    at java.lang.Runtime.loadLibrary(Runtime.java:366) 

Sembra come se il PathClassLoader guarda nelle directory sbagliate. Ho controllato il file apk fornito e mancano le librerie. Non esiste una cartella lib all'interno dell'apk. Il sistema di compilazione non include le librerie a 32 bit. Poiché esiste una sola versione di preinstallazione per armv7, queste librerie si trovano nella cartella app/src/main/jnilibs.

Devo aggiungere che questa configurazione funziona perfettamente per qualsiasi sistema Android a 32 bit. L'ho provato con l'emulatore e un dispositivo fisico prima.

Come si dovrebbe attivare il supporto multiarch 32/64 bit utilizzando gradle? O come è possibile distribuire un'applicazione a 32 bit su un sistema Android a 64 bit con Android Studio/gradle?

Ho cercato sul Web e ho trovato un collegamento relativo all'argomento, ma si riferisce al vecchio sistema di build: https://source.android.com/source/64-bit-builds.html. Non so come adottare la descrizione di gradle.

Sto utilizzando Android Studio (Build: 141.1989493, 6 giugno 2015). Il project/build.gradle non è stato toccato. Il file app/build.gradle assomiglia a questo:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 22 
    buildToolsVersion "22.0.1" 

    defaultConfig { 
     applicationId "<application_name>" 
     minSdkVersion 1 
     targetSdkVersion 22 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 
               'proguard-rules.pro' 
     } 
     debug { 
      debuggable true 
     } 
    } 

    productFlavors { 
     armv7 { 
      ndk { 
       abiFilter "armeabi-v7a" 
      } 
     } 
     fat 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
} 

risposta

1

Al fine di ottenere la distribuzione delle applicazioni a 32 bit per i 64 bit del sistema Android si ha la necessità di definire una armv7 productFlavor e una sottocartella all'interno della cartella jniLibs denominazione l'architettura corrispondente.

Definizione del prodotto sapore app/build.gradle:

android { 
    productFlavors { 
     armv7 { ndk { abiFilter "armeabi-v7a" } } 
     fat 
    } 
} 

struttura della libreria nativa:

app/src/main/jniLibs/armeabi-v7a 
+0

Qualcuno potrebbe spiegare per favore cosa è questo "grasso" in "productFlavors" e se è obbligatorio? – mithil1501

2

Il concetto di mulilib è solo per i progetti che fanno parte di una build sistema Android e non si deve impostare l'opzione android: multiarch in quanto disponi solo di librerie a 32 bit poiché questa opzione è solo per le app che forniscono librerie a 32 e 64 bit ad altre applicazioni installate.

I sistemi Android a 64 bit supportano direttamente le applicazioni a 32 bit. Devi solo imballare correttamente la tua app, con i tuoi file .so all'interno dello lib/(armeabi-v7a,x86,...) dell'APK, come per tutti i dispositivi Android.

Al momento dell'installazione, verranno installate le librerie dell'architettura preferite dal dispositivo. vale a dire: se non esiste una cartella x86_64, verranno installate le librerie x86/se non c'è una cartella arm64-v8a, verranno installate le librerie armeabi-v7a e l'app verrà eseguita in modalità a 32 bit.

Se non si dispone di nulla sotto lib, significa che Android Studio non conosce i file .so. Di default li cercherà all'interno di jniLibs/(armeabi-v7a,x86,...), quindi dovresti posizionarli lì o cambiare sourceSets.main.jniLibs.srcDir nella directory di tua scelta.