2016-01-15 12 views
6

Sto provando a creare apk universale per tutte le architetture. Qui è la mia struttura del progetto:Gradle Android, librerie native per diverse architetture

-App 
    -appModule 
    -libraryModule 
     -libs 
      -armeabi 
       -lib.so 
     -src 
      -java 
      -jni 

Ecco il mio file Gradle per libraryModule:

apply plugin: 'com.android.library' 

// http://stackoverflow.com/questions/28485309/how-to-build-single-apk-with-andoid-ndk-and-gradle 


android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.2" 

    defaultConfig { 
     ndk { 
      moduleName "ProxyResolver" // <-- This is the name of AndroidProxy native module 
      stl "gnustl_shared" 
      cFlags "-std=c++11" 
      abiFilters = ['armeabi'] 
      ldLibs (projectDir.absolutePath + "/libs/armeabi/libresolver.so") 
     } 
    } 

    sourceSets { 
     main { 
      jniLibs.srcDirs = ['libs'] 
     } 
    } 
} 

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

Come si può vedere il percorso per la libreria è hardcoded. E in questo momento è funziona su processori arm-v7. Ma ho bisogno di aggiungere il supporto di x86 senza l'aggiunta di un sapore

risposta

2

immagino:

ndk { 

    moduleName "resolver" 
    stl "gnustl_shared" 
    cFlags "-std=c++11" 
    abiFilters = ['armeabi','arm-v7'] 
} 

e rimuovere

sourceSets { 
    main { 
     jniLibs.srcDirs = ['libs'] 
    } 
} 
+0

Ho provato la tua variante, non funziona per me. libresolver.so è una libreria esterna, quindi non penso che dovrebbe essere con lo stesso nome del modulo. Ho un modulo - ProxyResolver che richiede così libreria libresolver.so – Vetalll

0

Impostazione abiFilters nel vostro defaultConfig solo aggiunge informazioni alla capacità del app (utile solo per il programma di installazione, vale a dire che il programma di installazione dà un errore quando il dispositivo che si tenta di installare non è compatibile) e non modifica i file binari aggiunti allofinale, vedere anche https://stackoverflow.com/a/39445685/1827156.

Immagino che quello che vuoi ottenere sia avere apk diverso per architetture diverse. Questo è un usecase comune, vale a dire per ridurre le dimensioni di costruzione. Puoi farlo usando splits nella tua app build.gradle. Si prega di fare riferimento a https://developer.android.com/studio/build/configure-apk-splits.html.

Consiglio vivamente https://www.neotechsoftware.com/blog/native-libraries-part-i-common-pitfalls (non sono l'autore).

Nota su come lavorare con le librerie/aar s: Tuttavia, c'è un importante scoglio quando si lavora con le librerie (aar invece di apk). Imho, non puoi (automagicamente) creare diversi aar specifici per l'ABI. Invece, si creano aar s contenenti i file binari per tutte le ABI. Quando aggiungi aar a un'app per Android, devi specificare splits nelle app build.gradle come indicato sopra.

Problemi correlati