android-studio agregar libreria - ¿Cómo incluir la biblioteca * .so en Android Studio?





4 Answers

Agregar .so Library en Android Studio 1.0.2

  1. Crear carpeta "jniLibs" dentro de "src / main /"
  2. Coloque todas sus bibliotecas .so dentro de la carpeta "src / main / jniLibs"
  3. La estructura de la carpeta parece,
    | --app:
    | - | --src:
    | - | - | --main
    | - | - | - | --jniLibs
    | - | - | - | - | --armeabi
    | - | - | - | - | - | -. so archivos
    | - | - | - | - | --x86
    | - | - | - | - | - | -. so archivos
  4. Ningún código adicional requiere simplemente sincronizar su proyecto y ejecutar su aplicación.

    Referencia
    https://github.com/commonsguy/sqlcipher-gradle/tree/master/src/main
importar jar export

Leí muchos hilos de cómo agregar una biblioteca * .so a Android Studio, pero ninguno de ellos funciona, especialmente cuando se trata del punto de texto: Esto no funciona con el xxx más nuevo (Android Studio, gradle, ...)

¿Podemos hacer un nuevo comienzo por favor? Tengo:

Android Studio 0.6.0

Desde la estructura del proyecto veo:

Ubicación del SDK:

/usr/share/android-studio/data/sdk
/usr/lib/jvm/default-java

Proyecto:

Gradle version 1.10
Android Plugin Version 0.11.+

Módulos / aplicación: Propiedades:

Compile Sdk Versión 19 Build Tools Versión 19.1.0

Dependencias:

{dir=libs, include=[*.jar]} Compile

{dir=libs, include=[*.so]}  Provided

m com.android.support: appcompat -v7:19.+   Compile

Obtuve los archivos * .so precompilados y en la aplicación de demostración que están trabajando. Tengo que cambiar el código fuente de la aplicación, así que necesito reconstruir con los mismos archivos * .so.




Solución 1: creación de una carpeta JniLibs

Crea una carpeta llamada "jniLibs" en tu aplicación y las carpetas que contienen tu * .so adentro. La carpeta "jniLibs" debe crearse en la misma carpeta que las carpetas "Java" o "Assets".

Solución 2: modificación del archivo build.gradle

Si no desea crear una nueva carpeta y mantener sus archivos * .so en la carpeta libs, ¡es posible!

En ese caso, solo agregue sus archivos * .so en la carpeta libs (respete la misma arquitectura que la solución 1: libs / armeabi / .so por ejemplo) y modifique el archivo build.gradle de su aplicación para agregar el directorio fuente de los jniLibs.

sourceSets {
    main {
        jniLibs.srcDirs = ["libs"]
    }
}

Tendrás más explicaciones, con capturas de pantalla para ayudarte aquí (Paso 6):

http://blog.guillaumeagis.eu/setup-andengine-with-android-studio/

EDITAR Tenía que ser jniLibs.srcDirs, no jni.srcDirs - editado el código. El directorio puede ser una ruta [relativa] que señala fuera del directorio del proyecto.




Para usar la biblioteca nativa (archivos so) Necesita agregar algunos códigos en el archivo "build.gradle".

Este código es para limpiar el directorio "armeabi" y copiar archivos 'so' en "armeabi" mientras que 'limpiar proyecto'.

task copyJniLibs(type: Copy) {
    from 'libs/armeabi'
    into 'src/main/jniLibs/armeabi'
}
tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn(copyJniLibs)
}
clean.dependsOn 'cleanCopyJniLibs'

Me han recomendado desde abajo. https://gist.github.com/pocmo/6461138




He resuelto un problema similar utilizando dependencias de lib nativas externas que se empaquetan dentro de archivos jar. A veces, estas bibliotecas dependen de la arquitectura y se empaquetan juntas en un solo contenedor, a veces se dividen en varios archivos jar. así que escribí algunos buildscript para escanear las dependencias de jar para libs nativas y ordenarlas en las carpetas de lib de Android correctas. Además, esto también proporciona una forma de descargar dependencias que no se encuentran en los repos de maven, que actualmente es útil para hacer que JNA trabaje en Android porque no todos los archivos jar nativos están publicados en repositorios maven públicos.

android {
    compileSdkVersion 23
    buildToolsVersion '24.0.0'

    lintOptions {
        abortOnError false
    }


    defaultConfig {
        applicationId "myappid"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ["src/main/jniLibs", "$buildDir/native-libs"]
        }
    }
}

def urlFile = { url, name ->
    File file = new File("$buildDir/download/${name}.jar")
    file.parentFile.mkdirs()
    if (!file.exists()) {
        new URL(url).withInputStream { downloadStream ->
            file.withOutputStream { fileOut ->
                fileOut << downloadStream
            }
        }
    }
    files(file.absolutePath)
}
dependencies {
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'
    compile 'com.android.support:design:23.3.0'
    compile 'net.java.dev.jna:jna:4.2.0'
    compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-arm.jar?raw=true', 'jna-android-arm')
    compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-armv7.jar?raw=true', 'jna-android-armv7')
    compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-aarch64.jar?raw=true', 'jna-android-aarch64')
    compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-x86.jar?raw=true', 'jna-android-x86')
    compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-x86-64.jar?raw=true', 'jna-android-x86_64')
    compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-mips.jar?raw=true', 'jna-android-mips')
    compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-mips64.jar?raw=true', 'jna-android-mips64')
}
def safeCopy = { src, dst ->
    File fdst = new File(dst)
    fdst.parentFile.mkdirs()
    fdst.bytes = new File(src).bytes

}

def archFromName = { name ->
    switch (name) {
        case ~/.*android-(x86-64|x86_64|amd64).*/:
            return "x86_64"
        case ~/.*android-(i386|i686|x86).*/:
            return "x86"
        case ~/.*android-(arm64|aarch64).*/:
            return "arm64-v8a"
        case ~/.*android-(armhf|armv7|arm-v7|armeabi-v7).*/:
            return "armeabi-v7a"
        case ~/.*android-(arm).*/:
            return "armeabi"
        case ~/.*android-(mips).*/:
            return "mips"
        case ~/.*android-(mips64).*/:
            return "mips64"
        default:
            return null
    }
}

task extractNatives << {
    project.configurations.compile.each { dep ->
        println "Scanning ${dep.name} for native libs"
        if (!dep.name.endsWith(".jar"))
            return
        zipTree(dep).visit { zDetail ->
            if (!zDetail.name.endsWith(".so"))
                return
            print "\tFound ${zDetail.name}"
            String arch = archFromName(zDetail.toString())
            if(arch != null){
                println " -> $arch"
                safeCopy(zDetail.file.absolutePath,
                        "$buildDir/native-libs/$arch/${zDetail.file.name}")
            } else {
                println " -> No valid arch"
            }
        }
    }
}

preBuild.dependsOn(['extractNatives'])





Related