Soy muy nuevo en todo este soporte de gradle y Android Studio. He logrado convertir mi proyecto de Android a gradle usando la opción de exportación.
Pero estoy buscando documentación o punto de inicio sobre cómo integrar la compilación NDK en el proceso de compilación de Gradle.
Si es posible, también necesito algún tipo de etapa "posterior" que copie los archivos binarios de compilación (archivos .so) en el directorio de activos.
android
android-ndk
gradle
android-studio
plaisthos
fuente
fuente
Respuestas:
Hemos lanzado una primera versión de la integración como vista previa en 1.3: http://tools.android.com/tech-docs/android-ndk-preview
La integración seguirá siendo una vista previa incluso después de que 1.3 sea final. No hay una ETA actual sobre cuándo será final (a partir del 10/07/2015).
Más información aquí: http://tools.android.com/tech-docs/android-ndk-preview
fuente
ACTUALIZACIÓN: Android Studio con soporte NDK ya está disponible: http://tools.android.com/tech-docs/android-ndk-preview
Para construir con un script, la solución de Gradle a continuación debería funcionar:
Estoy usando mi script de compilación y lo agregué a mi archivo (parece funcionar
0.8+
): esto parece ser equivalente a la solución a continuación (pero se ve mejor en el archivo gradle):Desafortunadamente, la compilación no falla si el directorio no está presente o no contiene
.so
archivos.fuente
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { it.jniFolders = [file("libs")] as Set }
. Gracias chicos por la ayuda!jni.srcDirs = [] //disable automatic ndk-build
es muy importante ya que evitará que Android Studio reconstruya el código fuente C / C ++. He estado tratando de resolver esto durante dos días hasta que vi tu publicación y esto resolvió mi problema. Realmente creo que la compilación de NDK se construye mejor por separado solo con el archivo MAKE de la línea de comandos de Android.mk, no con la secuencia de comandos Gradle, ya que Makefile ha creado C / C ++ durante más de 40 años.Con la actualización de Android Studio a 1.0, el soporte de la cadena de herramientas NDK mejoró inmensamente ( nota: lea mis actualizaciones al final de esta publicación para ver el uso con el nuevo complemento experimental Gradle y Android Studio 1.5 ).
Android Studio y el NDK se integran lo suficientemente bien como para que solo necesite crear un bloque ndk {} en el build.gradle de su módulo y configurar sus archivos de origen en el directorio (module) / src / main / jni, y estará ¡hecho!
No más ndk-build desde la línea de comandos.
He escrito todo sobre esto en mi blog aquí: http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
Los puntos más destacados son:
y pon esto en el build.gradle de tu módulo:
Ese es el proceso de compilar su código C ++, desde allí debe cargarlo y crear envoltorios, pero a juzgar por su pregunta, ya sabe cómo hacer todo eso, por lo que no volveré a hacer hash.
Además, he colocado un repositorio de Github de este ejemplo aquí: http://github.com/sureshjoshi/android-ndk-swig-example
ACTUALIZACIÓN: 14 de junio de 2015
Cuando salga Android Studio 1.3, debería haber un mejor soporte para C ++ a través del complemento JetBrains CLion. Actualmente estoy asumiendo que esto permitirá el desarrollo de Java y C ++ desde Android Studio; Sin embargo, creo que aún tendremos que usar la sección Gradle NDK como he dicho anteriormente. Además, creo que aún será necesario escribir archivos de envoltura Java <-> C ++, a menos que CLion los haga automáticamente.
ACTUALIZACIÓN: 5 de enero de 2016
He actualizado mi blog y el repositorio de Github (en la rama de desarrollo) para usar Android Studio 1.5 con el último complemento experimental de Gradle (0.6.0-alpha3).
http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/ http://github.com/sureshjoshi/android-ndk-swig-example
La compilación de Gradle para la sección NDK ahora se ve así:
Además, bastante asombroso, Android Studio tiene autocompletado para C ++: contenedores generados por Java usando la palabra clave 'nativa':
Sin embargo, no es completamente color de rosa ... Si está utilizando SWIG para ajustar una biblioteca para generar automáticamente el código, y luego intenta usar la palabra clave nativa autogeneración, colocará el código en el lugar incorrecto en su Swig _wrap archivo .cxx ... Por lo tanto, debe moverlo al bloque "C externo":
ACTUALIZACIÓN: 15 de octubre de 2017
Sería negligente si no mencionara que Android Studio 2.2 en adelante tiene soporte esencialmente 'nativo' (sin juego de palabras) para la cadena de herramientas NDK a través de Gradle y CMake. Ahora, cuando cree un nuevo proyecto, simplemente seleccione el soporte de C ++ y estará listo.
Aún necesitará generar su propio código de capa JNI, o usar la técnica SWIG que he mencionado anteriormente, pero el andamiaje de un proyecto C ++ en Android es trivial ahora.
Android Studio recogerá los cambios en el archivo CMakeLists (que es donde coloca los archivos fuente de C ++) y volverá a compilar automáticamente las bibliotecas asociadas.
fuente
En Google IO 2015, Google anunció la integración completa de NDK en Android Studio 1.3.
Ahora está fuera de vista previa y está disponible para todos: https://developer.android.com/studio/projects/add-native-code.html
Respuesta anterior: Gradle llama automáticamente
ndk-build
si tiene unjni
directorio en las fuentes de su proyecto.Esto está funcionando en Android Studio 0.5.9 (construcción canaria).
Descargar el NDK
Agregue
ANDROID_NDK_HOME
a sus variables de entorno o agreguendk.dir=/path/to/ndk
a sulocal.properties
en su proyecto de Android Studio. Esto permite que Android Studio ejecute el ndk automáticamente.Descargue los últimos proyectos de muestra de gradle para ver un ejemplo de un proyecto ndk. (Están al final de la página). Un buen proyecto de muestra es
ndkJniLib
.Copie los
gradle.build
proyectos de muestra de NDK. Se verá más o menos así. Estogradle.build
crea un apk diferente para cada arquitectura. Debe seleccionar qué arquitectura desea usar con elbuild variants
panel.Tenga en cuenta que esto ignorará sus archivos Android.mk y Application.mk. Como solución alternativa, puede indicarle a gradle que deshabilite la llamada atuomatic ndk-build, luego especifique el directorio para las fuentes ndk manualmente.
Además, es probable que desee llamar a ndk-build en su secuencia de comandos de construcción gradle explícitamente, porque acaba de deshabilitar la llamada automática.
fuente
tasks.all { task -> if (task.name.contains('Ndk')) task.enabled = false }
Encontré que "gradle 1.11 com.android.tools.build:gradle:0.9.+" ahora admite ndk precompilación, solo puede poner * .so en el directorio src / main / jniLibs. al construir gradle, se empaquetará el ndk en el lugar correcto.
aqui esta mi proyecto
fuente
Como dijo Xavier, puedes poner tus prebuilts en / src / main / jniLibs / si estás usando gradle 0.7.2+
tomado de: https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/ctDp9viWaxoJ
fuente
A partir de ahora (Android Studio v0.8.6) es bastante simple. Estos son los pasos para crear una aplicación tipo "Hola mundo":
Descargue el NDK de Android y coloque la carpeta raíz en algún lugar sano, tal vez en la misma ubicación que la carpeta SDK.
Agregue lo siguiente a su
local.properties
archivo:ndk.dir=<path-to-ndk>
Agregue lo siguiente a su archivo build.gradle dentro del
defaultConfig
cierre, justo después de laversionName
línea:ndk { moduleName="hello-world" }
En el
main
directorio de su módulo de aplicación , cree una nueva carpeta llamadajni
.En esa carpeta, cree un archivo llamado
hello-world.c
, que verá a continuación.Vea el
Activity
código de ejemplo a continuación para obtener un ejemplo de cómo llamar a un método (¿o es una función?)hello-world.c
.hello-world.c
MainActivity.java
build.gradle
Encuentre el código fuente completo de una aplicación muy similar aquí (menos el NDK).
fuente
Java_me_mattlogan_ndktest_MainActivity_stringFromJNI
la suya :)Si está en Unix, la última versión (0.8) agrega ndk-build. Aquí se explica cómo agregarlo:
Espera encontrar el JNI en 'src / main / jni', de lo contrario puede definirlo con:
A partir del 28 de enero de 2014 con la versión 0.8, la compilación está rota en Windows, debe deshabilitar la compilación con:
fuente
Se muestra una solución alternativa elegante en https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/Z5yWAvCh4h4J .
Básicamente, crea un jar que contiene "lib / armeabi / yourlib.so" y luego incluye el jar en la compilación.
fuente
ndk-build
, genera.jar
s para cada uno.so
y los coloca en la trayectoria de la estructura de Gradle para aliviar este dolor. Echale un vistazo.Una buena respuesta que automatiza el empaquetado de
.so
archivos fácilmente compilados se da en otro hilo (cerrado) . Para que eso funcione, tuve que cambiar la línea:dentro:
Sin este cambio
.so
, no se encontraron los archivos y, por lo tanto, la tarea de empaquetarlos nunca se ejecutaría.fuente
La respuesta de @plaisthos se rompió en la última versión de gradle, pero todavía hay una manera de hacerlo. Cree un
native-libs
directorio en la raíz del directorio de su proyecto y copie todas sus bibliotecas en este directorio.Agregue las siguientes líneas a su build.gradle. Construye y sé feliz.
fuente
Este es el código que uso para construir usando android-ndk de gradle. Para esto, agregue la ruta del directorio ndk en
gradle.properties
ie. añadirndkdir=/home/user/android-ndk-r9d
y poner todos los archivos en una carpeta JNInative
ensrc/main/
como se puede ver a partir del código publica a continuación. Creará jar con bibliotecas nativas que puede usar normalmente como enSystem.loadLibrary("libraryname");
fuente
He usado el siguiente código para compilar bibliotecas nativas de Dropbox, estoy usando Android Studio v1.1.
fuente
He usado
ndk.dir=/usr/shareData/android-ndk-r11b
// ruta de ndken el archivo local.properties en el proyecto de estudio de Android. y agregue esta línea:
android.useDeprecatedNdk=true
en el archivo gradle.properties en el proyecto de estudio de Android.
Más información aquí: http://tools.android.com/tech-docs/android-ndk-preview
fuente
Para ampliar lo que dijo Naxos (¡Gracias Naxos por enviarme en la dirección correcta!), Aprendí bastante de los ejemplos de NDK recientemente publicados y publiqué una respuesta en una pregunta similar aquí.
Cómo configurar NDK con el complemento Android Gradle 0.7
Esta publicación tiene detalles completos sobre cómo vincular bibliotecas nativas preconstruidas en su aplicación para las diversas arquitecturas, así como información sobre cómo agregar soporte NDK directamente al script build.gradle. En su mayor parte, ya no debería necesitar hacer el trabajo de comprimir y copiar.
fuente
Estos son los pasos que utilicé para que el NDK funcionara en mi proyecto de Android Studio. Usé este tutorial para ayudarme https://software.intel.com/en-us/videos/using-the-ndk-with-android-studio
Para usar NDK debe agregar una línea NDK a local.properties. Entonces, bajo su sdk.dir, agregue
En mis aplicaciones build.gradle tengo el siguiente código
moduleName es el nombre que desea darle a su código nativo. Creo que así se llamará la biblioteca compartida. ldLibs me permite iniciar sesión en LogCat, stl es el stl que desea importar. Hay muchas opciones, igual que el Eclipse NDK. ( http://www.kandroid.org/ndk/docs/CPLUSPLUS-SUPPORT.html )
c Las banderas siguen siendo una cierta cantidad de magia negra para mí. No he encontrado una buena fuente para todas las opciones y lo que me dan. Busque en StackOverflow cualquier cosa que necesite, ahí es donde la encontré. Sé que el c ++ 11 me permite usar el nuevo estándar c ++ 11.
Aquí hay un ejemplo de cómo inicio sesión en LogCat desde el código nativo
fuente
configure project en android studio desde eclipse: debe importar eclipse ndk project a android studio sin exportar a gradle y funciona, también necesita agregar la ruta de ndk en local.properties , si muestra un error, agregue
en el archivo build.gradle , luego cree la carpeta y el archivo jni usando la terminal y ejecútelo funcionará
fuente
Ahora que Android Studio está en el canal estable, es bastante sencillo ejecutar las muestras de Android-NDK . Estas muestras usan el complemento experimental ndk y son más recientes que las vinculadas desde la documentación en línea de Android NDK. Una vez que sepa que funcionan, puede estudiar los archivos build.gradle, local.properties y gradle-wrapper.properties y modificar su proyecto en consecuencia. Los siguientes son los pasos para que funcionen.
Vaya a configuración, Apariencia y comportamiento, Configuración del sistema, SDK de Android, seleccione la pestaña Herramientas del SDK y verifique la versión 1.0.0 de Android NDK en la parte inferior de la lista. Esto descargará el NDK.
Señale la ubicación del NDK recién descargado. Tenga en cuenta que se colocará en el directorio sdk / ndk-bundle. Para ello, seleccione Archivo, Estructura del proyecto, Ubicación del SDK (a la izquierda) y proporcione una ruta en la ubicación del NDK de Android. Esto agregará una entrada ndk a local.properties similar a esto:
He creado e implementado con éxito todos los proyectos en el repositorio de esta manera, excepto gles3gni, codec nativo y generador. Estoy usando lo siguiente:
Android Studio 1.3 build AI-141.2117773
muestras de android-ndk publicadas el 28 de julio de 2015 (enlace de arriba)
SDK Tools 24.3.3
NDK r10e extraído a C: \ Android \ sdk \ ndk-bundle
Gradle 2.5
Gradle plugin 0.2.0
Windows 8.1 64 bit
fuente
NDK Builds y gradle (básico)
En general, construir con el NDK es tan simple como especificar correctamente una ruta ndkBuild a Android.mk o una ruta cmake a CMakeLists.txt. Recomiendo CMake sobre el anterior Android.mk porque el soporte C / C ++ de Android Studio se basa en CLion y utiliza CMake como formato de proyecto. Esto en mi experiencia ha tendido a hacer que el IDE sea más receptivo en proyectos más grandes. Todo lo compilado en su proyecto se compilará y copiará en el APK automáticamente.
Agregar bibliotecas precompiladas al proyecto (avanzado)
Las bibliotecas estáticas (.a) en su compilación NDK se incluirán automáticamente, pero las bibliotecas dinámicas preconstruidas (.so) deberán colocarse
jniLibs
. Esto se puede configurar usandosourceSets
, pero debe adoptar el estándar. NO NECESITA ningún comando adicionalbuild.gradle
al incluir bibliotecas preconstruidas.El diseño de
jniLibs
Puede encontrar más información sobre la estructura en la Guía del usuario de Android Gradle Plugin .
A continuación, puede validar el APK resultante que contiene sus archivos .so, generalmente debajo
build/outputs/apk/
, usandounzip -l myApp.apk
para enumerar los contenidos.Construyendo bibliotecas compartidas
Si está creando una biblioteca compartida en el NDK, no necesita hacer nada más. Se incluirá correctamente en el APK.
fuente
Simplemente agregue estas líneas a la aplicación
build.gradle
fuente
¡Ahora puedo cargar el éxito!
1.Agregue el archivo .so a esta ruta
| --src | - | --main | - | - | --java | - | - | --jniLibs | - | - | - | --armeabi | - | - | - | - | -. así archivos
2.agregue este código a gradle.build
}
3)
System.loadLibrary("yousoname");
fuente
Si su proyecto se exportó desde eclipse, agregue los siguientes códigos en el archivo gradle:
2. Si crea un proyecto en el estudio de Android:
cree una carpeta llamada jniLibs en src / main / , y coloque sus archivos * .so en la carpeta jniLibs.
Y copie el código de la siguiente manera en su archivo gradle:
fuente
Si bien creo que SJoshi (oracle guy) tiene la respuesta más completa, el proyecto SWIG es un caso especial, interesante y útil, pero no generalizado para la mayoría de los proyectos que han funcionado bien con los proyectos estándar basados en hormigas SDK + NDK Es muy probable que todos estemos usando Android Studio ahora, o que deseemos una cadena de herramientas de compilación más amigable con CI para dispositivos móviles, que teóricamente ofrece Gradle.
Publiqué mi enfoque, tomé prestado de algún lugar (encontré esto en SO, pero publiqué una idea general de la aplicación build.gradle: https://gist.github.com/truedat101/c45ff2b69e91d5c8e9c7962d4b96e841 ). En pocas palabras, recomiendo lo siguiente:
Gradle para Android ha sido un desastre en mi opinión, por mucho que me gusten los conceptos de Maven prestados y la estructura obvia de los directorios para un proyecto. Esta función NDK ha estado "próximamente" por más de 3 años.
fuente