Enlace insatisfecho de Android usando gradle experimental v0.6.0-beta6
Estaba tratando de crear un proyecto simple para probar el NDK en el que un jnilib usa una biblioteca .so preconstruida, pero sigo recibiendo un error de Enlace insatisfecho:
Con emulador:
java.lang.UnsatisfiedLinkError: dlopen failed: library "~/AndroidStudioProjects/HelloAndroidJni/app/src/main/jni/libs/dynamic/x86/libadd.so" not found
Con dispositivo real:
Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1891]: 1675 could not load needed library '~/AndroidStudioProjects/HelloAndroidJni/app/src/main/jni/libs/dynamic/armeabi/libadd.so' for 'libhello-android-jni.so' (load_library[1093]: Library '~/AndroidStudioProjects/HelloAndroidJni/app/src/main/jni/libs/dynamic/armeabi/libadd.so' not found)
La biblioteca .so tiene una sola función "agregar" que agrega 2 números. Lo compilé con la cadena de herramientas independiente NDK para diferentes ABI (Doc):
add.c
#include "add.h"
int add(int x, int y){
return x + y;
}
Mi jni (archivo .c):
#include <jni.h>
#include "add.h"
JNIEXPORT jint JNICALL
Java_com_example_tomas_helloandroidjni_MainActivity_addNumbersJni(JNIEnv *env, jobject instance,
jint n1, jint n2) {
return add(n1, n2);
}
La estructura de mis archivos se ve así:
Y mi archivo gradle (como se define en elguía experimental de gradle):
apply plugin: 'com.android.model.application'
model {
repositories {
libs(PrebuiltLibraries) {
libadd{
headers.srcDir "src/main/jni/prebuilts/include"
binaries.withType(SharedLibraryBinary) {
sharedLibraryFile = file("src/main/jni/libs/dynamic/${targetPlatform.getName()}/libadd.so")
}
}
}
}
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
sources {
main {
jni {
dependencies {
library "libadd" linkage "shared"
}
}
}
}
ndk {
moduleName = "hello-android-jni"
debuggable = true
}
defaultConfig.with {
applicationId = "com.example.tomas.helloandroidjni"
minSdkVersion.apiLevel = 15
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
}
buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file("proguard-android.txt"))
}
}
productFlavors {
create ("x86"){
ndk.abiFilters.add("x86")
}
create("arm"){
ndk.abiFilters.add("armeabi")
}
create("arm7"){
ndk.abiFilters.add("armeabi-v7a")
}
create ("fat"){
}
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.0'
}
No estoy seguro de dónde mirar, ya que sigo recibiendo este error ... ¿Quizás necesito agregar una bandera o algo así?
Gracias de antemano por cualquier consejo!
EDITAR 1.
Intenté con bibliotecas estáticas y funcionan bien. Como consecuencia (de agregar las bibliotecas estáticas) cambié ligeramente la estructura de las carpetas (modificando el archivo gradle en consecuencia).
Estoy trabajando en ambos:
Dispositivo real:Samsung GT-I8190L Android 4.1.2, API 16 - Procesador ARMv7 rev 1 (v7l)Emulador:Nexus 4 API 23 - x86EDITAR 2.
Para compilar las bibliotecas lo estoy haciendo con elCadena de herramientas independiente NDK:
Dispositivo real (ARMv7):SYSROOT = $ NDK / plataformas / android-21 / arch-arm yCC = "$ NDK / toolchains / arm-linux-androideabi-4.8 / prebuilt / darwin-x86_64 / bin / arm-linux-androideabi-gcc-4.8 --sysroot = $ SYSROOT"
Emulador (x86):SYSROOT = $ NDK / plataformas / android-21 / arch-x86 yCC = "/ Users / Tomas / Library / Android / android-ndk-r10e / toolchains / x86-4.8 / prebuilt / darwin-x86_64 / bin / i686-linux-android-gcc-4.8 --sysroot = $ SYSROOT"