modulos - Incluye.so library en apk en android studio
librerias de android studio (3)
Para incluir bibliotecas nativas que necesita:
- crear un archivo "jar" con una estructura especial que contenga archivos ".so";
- incluir ese archivo en la lista de dependencias.
Para crear un archivo jar, use el siguiente fragmento de código:
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)
}
Para incluir el archivo resultante, pegue la siguiente línea en la sección "dependencias" en el archivo "build.gradle":
compile fileTree(dir: "$buildDir/native-libs", include: ''native-libs.jar'')
Esta pregunta ya tiene una respuesta aquí:
- Android studio, gradle y NDK 23 respuestas
Estoy intentando desarrollar una aplicación de Android simple en la que estoy tratando de usar sqlcipher , que usa las bibliotecas .so internamente. He leído la documentación sobre cómo usar sqlcipher con la aplicación de Android . He seguido los pasos y se compila sin ningún error. Pero, en tiempo de ejecución arroja UnsatisfiedLinkError
.
Buscando en Google, descubrí que, gradle aún no es compatible con .so libraries , pero encontré un hack here que estoy tratando de usar. Pero arroja error de tiempo de compilación en la línea # 40 en la esencia que es,
tasks.withType(com.android.build.gradle.PackageApplicationTask) { pkgTask ->
pkgTask.jniDir new File(buildDir, ''native-libs'')
}
diciendo
No se pudo encontrar la propiedad ''com'' en el Proyecto ''MyProject''
Aquí estoy publicando código de mi archivo 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'')
}
¿Puede alguien ayudarme en lo que he hecho mal o qué debo hacer para incluir esas bibliotecas .so en mi apk?
Como soy nuevo en el desarrollo de Android y gradle, discúlpame si he entendido mal algo.
Probé la solución presentada en la respuesta aceptada y no funcionó para mí. Quería compartir lo que funcionó para mí, ya que podría ayudar a alguien más. Encontré esta solución here .
Básicamente lo que tienes que hacer es colocar tus archivos .so
dentro de una carpeta llamada lib
(Nota: no son libs
y esto no es un error). Debe estar en la misma estructura que debería estar en el archivo APK
.
En mi caso fue:
Proyecto:
| --lib:
| - | --armeabi:
| - | - | -. so archivos.
Así que hice una carpeta lib y dentro de ella una carpeta armeabi donde inserté todos los archivos .so necesarios. Luego comprimí la carpeta en un .zip
(la estructura dentro del archivo zip ahora es lib / armeabi / *. Entonces) armeabi.jar
archivo .zip
en armeabi.jar
y agregué la compile fileTree(dir: ''libs'', include: ''*.jar'')
línea compile fileTree(dir: ''libs'', include: ''*.jar'')
en dependencies {}
en el archivo de compilación de gradle.
Esto resolvió mi problema de una manera bastante limpia.
Yo tuve el mismo problema. Mira el comentario en https://gist.github.com/khernyo/4226923#comment-812526
Dice:
para gradle android plugin v0.3 use "com.android.build.gradle.tasks.PackageApplication"
Eso debería arreglar tu problema.