2016-01-15 8 views
6

Ich versuche Universal apk für alle Architekturen zu bauen. Hier ist meine Projektstruktur:Android Gradle, native Bibliotheken für verschiedene Architekturen

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

Hier ist meine gradle Datei für 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']) 
} 

Wie Sie den Pfad für Bibliothek zu sehen ist fest einprogrammiert. Und jetzt funktioniert auf Arm-V7-Prozessoren. Aber ich brauche Unterstützung von x86 hinzuzufügen, ohne einen Geschmack Zugabe

Antwort

2

Ich denke:

ndk { 

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

Und entfernen

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

Ich versuchte yuor Variante, es funktioniert nicht für mich. libresolver.so ist eine externe Bibliothek, ich denke nicht, dass es mit dem gleichen Namen wie Modul sein sollte. Ich habe Modul - ProxyResolver, die so Bibliothek libresolver.so erfordert – Vetalll

0

Einstellung abiFilters in Ihrem defaultConfig nur Informationen zu den Fähigkeiten des App fügt (nur nützlich für das Installationsprogramm, dh der Installer gibt einen Fehler aus, wenn das Gerät, mit dem Sie versuchen, zu installieren, nicht kompatibel ist) und ändert nicht, welche Binärdateien zum endgültigenhinzugefügt werden, siehe auch https://stackoverflow.com/a/39445685/1827156.

Ich denke, was Sie erreichen möchten, ist verschiedene apk für verschiedene Architekturen zu haben. Dies ist ein üblicher Anwendungsfall, d. H. Um Build-Größen zu reduzieren. Sie können dies erreichen, indem Sie in Ihrer App splitsbuild.gradle verwenden. Bitte beziehen Sie sich auf https://developer.android.com/studio/build/configure-apk-splits.html.

Ich empfehle https://www.neotechsoftware.com/blog/native-libraries-part-i-common-pitfalls (ich bin nicht der Autor).

Hinweis auf die Arbeit mit Bibliotheken/aar s: Allerdings gibt es einen großen Sünden, wenn Sie mit Bibliotheken arbeiten (aar statt apk). Imho, du kannst nicht (automatisch) verschiedene ABI-spezifische aar s erstellen. Stattdessen erstellen Sie aar s mit den Binärdateien für alle ABIs. Wenn Sie die aar einer Android App hinzufügen, geben Sie splits in den Apps build.gradle wie oben erwähnt an.