web-dev-qa-db-fra.com

Comment puis-je ajouter des fichiers .so à un projet de bibliothèque Android en utilisant Gradle 0.7+

Structure du projet:

Projet d'application -> dépend du projet de bibliothèque

Library Project a un dossier pour les bibliothèques jni compilées

jniLibs.srcDirs = ['libs']

Et j'ai essayé d'ajouter ce qui suit à l'élément Android de build.gradle selon l'exemple d'application https://Android.googlesource.com/platform/tools/build /+/2e1f7810edd76d92cee8d3e06bc4dec0c288adea/tests/ndkSanAngeles/build.gradle cependant Android les projets de bibliothèque ne prennent pas en charge productFlavours et, à ce titre, l'assemblage échoue avec "Impossible de trouver la méthode productFlavors () pour les arguments [ dghdhd] sur le projet "

productFlavors {
    x86 {
        ndk {
            abiFilter "x86"
        }
    }
    arm {
        ndk {
            abiFilters "armeabi-v7a", "armeabi"
        }
    }
}

Existe-t-il un moyen d'ajouter la prise en charge NDK à un projet de bibliothèque Android?

34
Alec Holmes

Au final, je n'avais pas besoin d'utiliser les saveurs des produits.

Pour le projet de bibliothèque, j'ai ajouté ce qui suit:

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

Le dossier libs avait un dossier à l'intérieur appelé "armeabi-v7a" et comme c'est ma seule cible, il a fonctionné un régal.

Les fichiers ndk (.so) sont propagés dans le projet Android Android qui utilise le projet de bibliothèque Android).

66
Alec Holmes

Exemple avec le nouveau plugin expérimental Android Gradle .


Exigences:

  • Android Studio 1.5+
  • gradle-2.10
  • gradle-experimental: 0.6.0-alpha5

1) Vous pouvez simplement mettre toutes les bibliothèques natives partagées dans le dossier main/jniLibs, par défaut.

Structure du projet

dossier racine/Android

dossier racine/Android_project/app/src/main/jniLibs/x86

dossier racine/Android_project/app/src/main/jniLibs/armeabi-v7a

dossier racine/Android_project/app/src/main/jniLibs/...

Gradle les téléchargera automatiquement sur l'appareil.

Ensuite, vous pouvez charger la bibliothèque dans une application.

static {
    System.loadLibrary("mylibrary");
}

2) Vous pouvez également placer toutes les bibliothèques natives partagées dans l'emplacement personnalisé.

Exemple avec un chemin vers le répertoire bin/Android/Debug.

Dans ce cas, vous devez définir manuellement l'emplacement des bibliothèques dans le fichier build.gradle.

Structure du projet

dossier racine/Android

dossier racine/bin/Android/Debug/jniLibs/x86

dossier racine/bin/Android/Debug/jniLibs/armeabi-v7a

dossier racine/bin/Android/Debug/jniLibs/...

dossier racine/Android_project/app/build.gradle

apply plugin: 'com.Android.model.application'

model {
    Android {
        sources {
            main {
                jni {
                    source {
                        srcDirs = []
                    }
                }

                jniLibs {
                    source {
                        srcDirs "/../../bin/Android/Debug/jniLibs"
                    }
                }
            }
        }
    }
}
11
Maks

Selon ce fil:

https://groups.google.com/forum/#!topic/adt-dev/nQobKd2Gl_8

ne pas pouvoir ajouter des fichiers .so aux projets de bibliothèque était un bug qui a été corrigé dans la v0.8 du plugin.

0
Scott Barta

Je travaille avec Android Studio 2.1, et j'ai trouvé que l'ajout de l'entrée sources ou sourceSets à mon build.gradle n'avait aucun effet apparent. Au lieu de cela, j'ai trouvé que j'avais besoin des éléments suivants:

Android {
    defaultConfig {
        ndk {
            moduleName "libmp3lame"
        }
    }
0
Jerry Agin