ndk - Paquete AAR de Android para biblioteca nativa
android ndk descargar (3)
Aunque no lo he intentado personalmente, he encontrado varios pasos github.com/googlesamples/android-ndk/issues/261 :
Probablemente indirectamente [lo intenté con lib lib compartido hace un tiempo], y personalmente no creo que valga la pena:
- primero construye tu lib para generar una lib estática, y una aar [model.library no mete * .a en el directorio libs]
- descomprima su aar, y ponga * .a en la carpeta libs
- encuentra un lugar para tu archivo de encabezados
- comprímalo para volver a estar dentro de su aplicación, haga que sea su biblioteca dependiente, de modo que se extraiga en la carpeta explotada; entonces aparece la imagen colorida.
- agregue el directorio aar explotado intermedio en la ruta de inclusión. Creo que es demasiado intrépido y puede que no sea una buena idea imponerlos a sus clientes.
La forma tradicional de distribuir archivos de cabecera y lib es directamente mejor, en comparación con la piratería anterior. Para crear libs, cmake way es mucho mejor, compruebe hello-libs en master-cmake branch, espero que esto ayude
Estoy buscando una forma de empaquetar una biblioteca nativa en un paquete AAR, por lo que sería posible usarla a través de la declaración de dependencias en el script de Gradle.
Por biblioteca nativa me refiero a un conjunto de archivos .cpp o una biblioteca estática compilada y un conjunto de archivos de encabezado. Entonces, quiero decir que la aplicación en sí llamará a la biblioteca desde un código nativo, no desde Java. En otras palabras, la biblioteca necesitaba compilar el código nativo de la aplicación. Para que sea posible gestionar fácilmente las dependencias de código nativo.
¿Es incluso posible?
Hasta ahora solo pude encontrar muchas preguntas / ejemplos de cómo hacer un AAR de la biblioteca nativa JNI con el archivo .so y su interfaz Java, por lo que la biblioteca es solo una biblioteca Java con implementación nativa, pero no es lo que necesito.
Desde este Link , no parece que sea posible. Estoy pegando debajo de los contenidos:
Anatomía de un archivo AAR
La extensión de archivo para un archivo AAR es .aar, y el tipo de artefacto Maven también debe ser aar. El archivo en sí es un archivo zip que contiene las siguientes entradas obligatorias:
- /AndroidManifest.xml
- /classes.jar
- / res /
- /R.txt
Además, un archivo AAR puede incluir una o más de las siguientes entradas opcionales:
- /bienes/
- /libs/name.jar
- /jni/abi_name/name.so (donde abi_name es una de las ABI compatibles con Android)
- /proguard.txt
- /lint.jar
Como se dijo anteriormente, la entrada obligatoria incluye un frasco. Sin embargo, puede intentarlo eliminando manualmente el archivo jar descomprimiendo el aar y el archivo zip nuevamente. Sin embargo, no estoy seguro de si funcionará.
Encontró la siguiente solución hacky para el problema:
Utilice el complemento experimental Gradle de Android versión 0.9.1. La idea es poner encabezados de biblioteca y bibliotecas estáticas en .aar. Los encabezados se colocan en ndkLibs/include
y las ndkLibs/include
estáticas en ndkLibs/<arch>
para cada arquitectura. Luego, en la aplicación u otra biblioteca que depende de esta ndkLibs
empaquetada, simplemente extraemos el directorio ndkLibs
de AAR al directorio de build
del proyecto. Vea el ejemplo del archivo de gradle a continuación.
El archivo build.gradle
para la biblioteca con comentarios:
apply plugin: "com.android.model.library"
model {
android {
compileSdkVersion = 25
buildToolsVersion = ''25.0.2''
defaultConfig {
minSdkVersion.apiLevel = 9
targetSdkVersion.apiLevel = 9
versionCode = 1
versionName = ''1.0''
}
ndk {
platformVersion = 21
moduleName = "mylib"
toolchain = ''clang''
abiFilters.addAll([''armeabi'', ''armeabi-v7a'', ''arm64-v8a'', ''x86'', ''x86_64'', ''mips'', ''mips64'']) //this is default
ldLibs.addAll([''android'', ''log''])
stl = ''c++_static''
cppFlags.add("-std=c++11")
cppFlags.add("-fexceptions")
cppFlags.add("-frtti")
//Add include path to be able to find headers from other AAR libraries
cppFlags.add("-I" + projectDir.getAbsolutePath() + "/build/ndkLibs/include")
}
//For each ABI add link-time library search path to be able to link against other AAR libraries
abis {
create("armeabi") {
ldFlags.add("-L" + projectDir.getAbsolutePath() + "/build/ndkLibs/armeabi")
}
create("armeabi-v7a") {
ldFlags.add("-L" + projectDir.getAbsolutePath() + "/build/ndkLibs/armeabi-v7a")
}
create("arm64-v8a") {
ldFlags.add("-L" + projectDir.getAbsolutePath() + "/build/ndkLibs/arm64-v8a")
}
create("x86") {
ldFlags.add("-L" + projectDir.getAbsolutePath() + "/build/ndkLibs/x86")
}
create("x86_64") {
ldFlags.add("-L" + projectDir.getAbsolutePath() + "/build/ndkLibs/x86_64")
}
create("mips") {
ldFlags.add("-L" + projectDir.getAbsolutePath() + "/build/ndkLibs/mips")
}
create("mips64") {
ldFlags.add("-L" + projectDir.getAbsolutePath() + "/build/ndkLibs/mips64")
}
}
}
//Configure this library source files
android.sources {
main {
jni {
//This does not affect AAR packaging
exportedHeaders {
srcDir "../../src/"
}
//This tells which source files to compile
source {
srcDirs ''../../src''
}
}
}
}
}
//Custom Maven repository URLs to download AAR files from
repositories {
maven {
url ''https://dl.bintray.com/igagis/android/''
}
}
//Our custom AAR dependencies, those in turn are also packed to AAR using the same approach
dependencies {
compile fileTree(dir: ''libs'', include: [''*.jar''])
compile ''io.github.igagis:libutki:+''
compile ''io.github.igagis:libsvgdom:+''
compile ''org.cairographics:cairo:+''
}
//===================================
//=== Extract NDK files from AARs ===
//This is to automatically extract ndkLibs directory from AAR to build directory before compiling any sources
task extractNDKLibs {
doLast {
configurations.compile.each {
def file = it.absoluteFile
copy {
from zipTree(file)
into "build/"
include "ndkLibs/**/*"
}
}
}
}
build.dependsOn(''extractNDKLibs'')
tasks.whenTaskAdded { task ->
if (task.name.startsWith(''compile'')) {
task.dependsOn(''extractNDKLibs'')
}
}
//=================================
//=== pack library files to aar ===
//This stuff re-packs the release AAR file adding headers and static libs to there, but removing all shared (.so) libs, as we don''t need them. The resulting AAR is put to the project root directory and can be uploaded to Maven along with POM file (you need to write one by hand).
def aarName = name
task copyNdkLibsToAAR(type: Zip) {
baseName = aarName
version = "/$(version)"
extension = ''aar.in''
destinationDir = file(''..'') //put resulting AAR file to upper level directory
from zipTree("build/outputs/aar/" + aarName + "-release.aar")
exclude(''**/*.so'') //do not include shared libraries into final AAR
from("../../src") {
exclude(''makefile'')
exclude(''soname.txt'')
exclude(''**/*.cpp'')
exclude(''**/*.c'')
into(''ndkLibs/include'')
}
from("build/intermediates/binaries/debug/lib"){
include(''**/*.a'')
into(''ndkLibs'')
}
}
build.finalizedBy(''copyNdkLibsToAAR'')