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:
- C ++ ifstream.getline () significativamente más lento que BufferedReader.readLine () de Java?
- Java mmap falla en Android con "mmap failed: ENOMEM (Fuera de memoria)"
- No se pueden incluir archivos de encabezado STL con Android NDK r5
- Compartir descriptores de archivos de memoria compartida en aplicaciones / procesos android utilizando el archivo de enlace
- Actualización del ejemplo HelloJni
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" }
- Android NDK código nativo verdadero nativo?
- ¿Cómo puedo agregar un archivo a un proyecto de Android y luego cargarlo usando el NDK
- UnsatisfiedLinkError: No se pudo cargar X desde el cargador
- Cómo excluir un archivo cpp en gradle experimental?
- No se puede encontrar el archivo .so en un dispositivo Android de 64 bits
- Android NDK producir binarios grandes irrazonable, la forma de optimizar el tamaño.
- Cómo inyectar la biblioteca en el proceso Android zygote?
- Uso de NDK con STL en Android Studio gradle project
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
- Crear carpeta "jniLibs" dentro de "src / main /"
- Coloque todas sus bibliotecas .so dentro de la carpeta "src / main / jniLibs"
- La estructura de la carpeta parece,
| –app:
| – | –src:
| – | – | –main
| – | – | – | –jniLibs
| – |
Archivos - 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" }
- ListView de filtros de búsqueda de Android
- Android GridView de columna, anchura variable como la aplicación GooglePlus