web-dev-qa-db-fra.com

Inclure la bibliothèque .so dans apk dans Android studio

J'essaie de développer une application Android simple dans laquelle j'essaie d'utiliser sqlcipher , qui utilise des bibliothèques .so en interne. J'ai lu la documentation sur comment utiliser sqlcipher avec Android app . J'ai suivi les étapes et il se compile sans aucune erreur. Mais, à l'exécution, il jette UnsatisfiedLinkError.

En cherchant sur Google, j'ai trouvé que, Gradle ne supporte pas encore les bibliothèques .so , mais j'ai trouvé un bidouillage ici que j'essaie d'utiliser. Mais il jette une erreur de compilation à la ligne 40 sur le Gist qui est,

tasks.withType(com.Android.build.gradle.PackageApplicationTask) { pkgTask ->
    pkgTask.jniDir new File(buildDir, 'native-libs')
}

en disant

Impossible de trouver la propriété 'com' sur le projet 'MyProject'

Ici, je poste le code de mon fichier build.gradle.

buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:0.4'
    }
}
apply plugin: 'Android'

dependencies {
    compile files('libs/Android-support-v4.jar')
    compile files('libs/commons-codec.jar')
    compile files('libs/guava-r09.jar')
    compile files('libs/sqlcipher.jar')
}

targetCompatibility = 1.6
sourceCompatibility = 1.6

Android {
    target = 'Android-14'

    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 16
    }    

}

task copyNativeLibs(type: Copy) {
    from(new File(project(':MyProject').buildDir, 'native-libs')) { include '**/*.so' }
    into new File(buildDir, 'native-libs')
}

tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }

clean.dependsOn 'cleanCopyNativeLibs'

tasks.withType(com.Android.build.gradle.PackageApplicationTask) { pkgTask ->
    pkgTask.jniDir new File(buildDir, 'native-libs')
}

Quelqu'un peut-il m'aider s'il vous plaît sur ce que j'ai fait de mal ou que dois-je faire pour inclure ces bibliothèques .so dans mon apk?

Comme je suis nouveau dans Android développement et mise au point, veuillez m'excuser si j'ai mal compris quelque chose.

138
Rumit Parakhiya

J'ai eu le même problème. Découvrez le commentaire dans https://Gist.github.com/khernyo/4226923#comment-812526

Ça dit:

pour Gradle Android plugin v0.3, utilisez "com.Android.build.gradle.tasks.PackageApplication"

Cela devrait résoudre votre problème.

27
Paglian

J'ai essayé la solution présentée dans la réponse acceptée et cela n'a pas fonctionné pour moi. Je voulais partager ce que DID fonctionne pour moi, car cela pourrait aider quelqu'un d'autre. J'ai trouvé cette solution ici .

Ce que vous devez faire est de placer vos fichiers .so dans un dossier nommé lib (Remarque: ce n'est pas libs et ce n'est pas une erreur). Il devrait être dans la même structure que dans le fichier APK.

Dans mon cas c'était:
Projet:
| --lib:
| - | --armeabi:
| - | - | -. so fichiers.

J'ai donc créé un dossier lib et un dossier armeabi dans lequel j'ai inséré tous les fichiers .so nécessaires. J'ai ensuite compressé le dossier dans un .Zip (la structure à l'intérieur du fichier Zip est maintenant lib/armeabi/*. So). J'ai renommé le fichier .Zip en armeabi.jar et ajouté la ligne compile fileTree(dir: 'libs', include: '*.jar') dans dependencies {} dans le fichier de construction du dégradé.

Cela a résolu mon problème d'une manière plutôt propre.

255
Assaf Gamliel

Pour inclure les bibliothèques natives, il vous faut:

  1. créer un fichier "jar" avec une structure spéciale contenant des fichiers ".so";
  2. inclure ce fichier dans la liste des dépendances.

Pour créer un fichier jar, utilisez l'extrait suivant:

task nativeLibsToJar(type: Zip, description: 'create a jar archive of the native libs') {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    extension 'jar'
    from fileTree(dir: 'libs', include: '**/*.so')
    into 'lib/'
}

tasks.withType(Compile) {
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
}

Pour inclure le fichier résultant, collez la ligne suivante dans la section "dépendances" du fichier "build.gradle":

compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
66
Ruslan Yanchyshyn