NDK: cómo incluir archivos * .so en AndroidStudio

Tengo libs jar y * .so. Creé el proyecto Eclipse como en el tutorial (para este libs). Ahora estoy haciendo un proyecto en Android Studio, pero el sistema no puede encontrar archivos * .so. Hago cómo en esto: incluye la biblioteca .so en apk en el estudio de Android . Mi aplicación no encuentra la función en libs. ¿Cómo encontrarlos? Iniciar sesión:

10-16 12:16:55.965: W/dalvikvm(4386): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/atol/drivers/fptr/IFptrNative; 10-16 12:16:55.965: W/dalvikvm(4386): threadid=1: thread exiting with uncaught exception (group=0x41869438) 10-16 12:16:55.976: E/AndroidRuntime(4386): FATAL EXCEPTION: main 10-16 12:16:55.976: E/AndroidRuntime(4386): java.lang.ExceptionInInitializerError 

Se produce un error al crear un objeto utilizando una biblioteca JAR. Ella a su vez pinchó * .so archivos, pero para encontrar lo que necesita. ¿Quién tiene la culpa y qué hacer?

Tres opciones:

Uno

Copie las bibliotecas * .SO en su carpeta libs y Build.gradle en Build.gradle :

 dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') } 

Dos

Crea una nueva carpeta en src/main/jniLibs y escríbela en tu Build.gradle :

 android { //.................Another code sourceSets { main { jniLibs.srcDirs = ['src/main/jnilibs'] } //Another code }//Android tag close 

Ahí

Crea una nueva carpeta en src/main/jniLibs y escríbela en tu Build.gradle :

 //Another code.... dependencies { compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar') }//end dependencies task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') { destinationDir file("$buildDir/native-libs") baseName 'native-libs' from fileTree(dir: 'src/main/jnilibs', include: '**/*.so') into 'lib/' } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn(nativeLibsToJar) } 

Solución actual

Cree la carpeta project / app / src / main / jniLibs, y luego ponga sus archivos * .so dentro de sus carpetas abi en esa ubicación. P.ej,

 project/ ├──libs/ | └── *.jar < -- if your library has jar files, they go here ├──src/ └── main/ ├── AndroidManifest.xml ├── java/ └── jniLibs/ ├── arm64-v8a/ <-- ARM 64bit │ └── yourlib.so ├── armeabi-v7a/ <-- ARM 32bit │ └── yourlib.so └── x86/ <-- Intel 32bit └── yourlib.so 

Solución obsoleta

Agregue ambos fragmentos de código en su archivo gradle.build de módulo como una dependencia:

 compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar') How to create this custom jar: task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') { destinationDir file("$buildDir/native-libs") baseName 'native-libs' from fileTree(dir: 'libs', include: '**/*.so') into 'lib/' } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn(nativeLibsToJar) } 


Debes colocar tus archivos .so dentro de una carpeta llamada lib (no es libs y debería ser lib). Debe estar en la misma estructura que debería estar en el archivo APK.

Estructura

 Project: |--lib: |--|--armeabi: |--|--|--.so files. 

Luego, una carpeta armeabi donde insertar todos los archivos .so . Luego comprime la carpeta en .zip. Renombra el archivo .zip en armeabi.jar y agrega la compile fileTree(dir: 'libs', include: '*.jar') línea compile fileTree(dir: 'libs', include: '*.jar') en dependencies {} en el archivo de comstackción de gradle.

Para obtener más información y un método alternativo, consulte Esta respuesta y Esta respuesta

Cree el nombre de la carpeta “jniLibs” dentro de la carpeta src / main y agregue Todas las carpetas que contienen su archivo “* .so” y sincronice y ejecute su aplicación. No se requieren otros pasos.