138 votes

Inclure .si la bibliothèque en apk android studio

Je suis en train d'essayer mes mains sur le développement d'une simple application android dans lequel je suis en train d'utiliser sqlcipher, qui utilise .ainsi, les bibliothèques à l'interne. J'ai lu la documentation sur la façon d'utiliser sqlcipher avec l'application android. J'ai suivi les étapes et il se compile sans erreur. Mais, à l'exécution, il jette UnsatisfiedLinkError.

Googler autour, j'ai trouvé que, gradle ne prend pas en charge .ainsi, les bibliothèques encore, mais j'ai trouvé un hack ici qui je suis en train d'utiliser. Mais il jette erreur de compilation à la ligne #40 sur l'essentiel qui est,

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

en disant:

Ne pouvait pas trouver la propriété de " com "sur Projet "MyProject'

Je suis ici poster du code de mon build.gradle fichier.

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')
}

Peut, n'importe qui s'il vous plaît aidez-moi sur ce que j'ai mal fait ou que dois-je faire pour les intégrer .ainsi, les bibliothèques dans mon apk?

Comme je suis nouveau sur le développement android et gradle, veuillez m'excuser-moi si j'ai mal compris quelque chose.

256voto

Assaf Gamliel Points 4792

J'ai essayé la solution présentée dans l'acceptation de réponse et il ne fonctionne pas pour moi. Je voulais partager ce qui A fonctionné pour moi car elle pourrait aider quelqu'un d'autre. J'ai trouvé cette solution ici.

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

Dans mon cas, c'était:
Projet:
|--lib:
|--|--armeabi:
|--|--|--.donc les fichiers.

J'ai donc fait un dossier lib et à l'intérieur d'un armeabi dossier dans lequel j'ai inséré tout le nécessaire .donc les fichiers. J'ai ensuite zippé le dossier en .zip (la structure à l'intérieur du fichier zip est maintenant lib/armeabi/*.donc) j'ai renommé l' .zip le fichier en armeabi.jar et ajout de la ligne, compile fileTree(dir: 'libs', include: '*.jar') en dependencies {} dans le gradle du fichier build.

Cela a résolu mon problème dans un lieu propre.

67voto

Ruslan Yanchyshyn Points 1066

Pour inclure les bibliothèques natives dont vous avez besoin:

  1. créer "pot" de fichiers avec la structure spéciale contenant ".de sorte que" les fichiers;
  2. inclure ce fichier dans la liste de dépendances.

Pour créer le fichier jar, utilisez le code 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 qui en résulte, collez la ligne suivante dans "dépendances" de la rubrique "construire.gradle" fichier:

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

27voto

Paglian Points 416

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

Il dit:

pour gradle android plugin v0.3 utilisez "com.android.construire.gradle.les tâches.PackageApplication"

Cela devrait résoudre votre problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X