Incluir la biblioteca estática pre-compilada usando NDK

Estoy buscando para incluir una biblioteca estática que está pre-compilado en mi proyecto de Android Studio NDK. Estoy usando Android Studio 1.0.1, y cualquier solución que intente este problema en SO parece anticuada (o implica la creación de un proyecto de biblioteca y su inclusión).

La estructura es la siguiente:

app /--src /--main /--java +--jni +--jniLibs /--armeabi /--libpng.a --armeabiv7 /--libpng.a ...(for each abi) 

Estoy tratando de incluir la biblioteca libpng. He intentado crear jniLibs (como por ph0b (guía impresionante, btw) y la adición de libpng.a a la respectiva carpeta ABI Esto todavía me da el error – no puede encontrar -llibpng cuando intento compilar con el siguiente código:

 ndk { moduleName "game" cFlags "-std=c++11 -fexceptions -DANDROID -I${project.buildDir}/../src/main/jni/include \ -I${project.buildDir}/../src/main/jni/include/png" ldLibs "EGL", "GLESv3", "dl", "log", "android", "libpng" stl "gnustl_static" } 

Esto ahora funciona correctamente a través del plugin experimental.

Para una descripción completa, vea este excelente artículo completo , que es donde estoy tomando esto, pero también lo estoy usando yo mismo y funciona.

Este es mi build.gradle – tenga en cuenta que en mi caso es para un proyecto de biblioteca, y estoy usando enlaces estáticos en lugar de compartidos.

 buildscript { dependencies { classpath "com.android.tools.build:gradle-experimental:0.7.0-alpha3" } } apply plugin: 'com.android.model.library' model { repositories { libs(PrebuiltLibraries) { v8_base { binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("src/main/jni/libs/${targetPlatform.getName()}/libv8_base.a") } } v8_libbase { binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("src/main/jni/libs/${targetPlatform.getName()}/libv8_libbase.a") } } v8_libplatform { binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("src/main/jni/libs/${targetPlatform.getName()}/libv8_libplatform.a") } } v8_nosnapshot { binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("src/main/jni/libs/${targetPlatform.getName()}/libv8_nosnapshot.a") } } } } android { compileSdkVersion 23 buildToolsVersion "23.0.2" sources { main { jni { source { srcDir "src/main/jni" } dependencies { library "v8_base" linkage "static" library "v8_libbase" linkage "static" library "v8_libplatform" linkage "static" library "v8_nosnapshot" linkage "static" } } } } ndk { moduleName "v8example" cppFlags.add("-std=c++11") cppFlags.add("-I${file("src/main/jni/include")}".toString()) cppFlags.add("-fexceptions") ldLibs.add("log") stl "stlport_static" abiFilters.add("armeabi armeabi-v7a x86") } } } 

La alternativa es que uses el antiguo enfoque de Gradle para llamar a ndkBuild a ti mismo, usando los archivos .mk . Eso también funciona bien, pero se pierde la buena integración con Android Studio, por ejemplo, sus archivos jni aparecer adecuadamente.

Adición de la biblioteca .so 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
    | – |
    Archivos
  4. Ningún código extra requiere sincronizar su proyecto y ejecutar su aplicación.

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

Como el soporte ndk ahora está limitado en gradle, puede probar esto para bibliotecas estáticas de diferentes abi.

  ndk { moduleName "game" .... ldLibs ..., file(projectDir).absolutePath+"/src/main/jniLibs/\$(TARGET_ARCH_ABI)/libpng.a" .... } 

No sólo puede incluir los archivos .so, también necesita tener las carpetas src que realmente proporcionan la interfaz para acceder a los métodos en esos archivos .so. Recomendaría contra acoplar su proyecto a la biblioteca de esa manera.

La mejor manera es incluirlo como un módulo de biblioteca de android studio y descartar las carpetas jni para deshabilitar ndkbuild y apuntar el jnilib a la carpeta / libs agregando el siguiente al archivo build.gradle

 jni.srcDirs = [] //disable automatic ndk-build call jniLibs.srcDirs = [ 'libs' ] //no need to copy the .so files from /libs to /jniLibs folder 

(Compruebe que el directorio libs también ha sido importado correctamente por android studio con archivos .so)

Importar la biblioteca como un módulo se ocupa de seguir automáticamente

A) carpeta de biblioteca de yourlibrary en su carpeta de proyecto y reestructurado de acuerdo con gradle convention b) importó el proyecto (include ': yourlibrary ' en settings.gradle) y
C) creó las dependencias ("Archivo -> Estructura del proyecto -> Seleccionar el módulo principal de la aplicación de la subventana izquierda -> Dependencias (última pestaña) -> Presiona el" + "verde a tu derecha -> tu biblioteca como Dependencia del Módulo – )

Esto es realmente feo, pero funciona! Puede engañar a Gradle para que le permita inyectar código en el archivo Android.mk generado:

  ndk { abiFilter "armeabi-v7a" // We need to inject the static library into the // NDK build, and Gradle doesn't offer a way to directly // modify the Android.mk file... So we hack it! // // You can see the end result at: // build/intermediates/ndk/debug/Android.mk moduleName "This_is_a_terrible_Gradle_hack\n" + "include \$(CLEAR_VARS)\n" + "LOCAL_MODULE := mystaticlib_prebuilt\n" + "LOCAL_EXPORT_C_INCLUDES := mystaticlib/include\n" + "LOCAL_SRC_FILES := mystaticlib/libmystaticlib.a\n" + "include \$(PREBUILT_STATIC_LIBRARY)\n" + "include \$(CLEAR_VARS)\n" + "LOCAL_MODULE := MyActualModule\n" + "LOCAL_STATIC_LIBRARIES += mystaticlib_prebuilt" cFlags "-std=c++11 -fexceptions -frtti -pthread" stl "gnustl_shared" ldLibs "log", "OpenSLES", "z" } 
  • No se encontró JNI_OnLoad saltando init> Apagado de la aplicación
  • Estudio de Android, gradle y NDK
  • Compilación de Lua lib para Android - éxito, pero extraños segfaults
  • ¿Cuáles son las implicaciones de portabilidad de usar el NDK?
  • Uso de libVLC para Android en la plataforma Windows
  • Cómo dibujar / hacer una colisión de física de bala cuerpo / forma?
  • Android: Dialog de diálogo de actividad desaparece inesperadamente
  • ¿Cómo ejecutar los comandos ffmpeg de línea de comandos en el android?
  • Android AlertDialog congela la aplicación unos segundos después de mostrarse - la causa parece relacionada con OpenSL
  • Error de Compilación NDK de Android NDK_PROJECT_PATH = nulo
  • Compilación de la aplicación android utilizando boost, referencia indefinida a 'mbtowc'
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.