Cómo compilar cualquier biblioteca nativa (C, C ++) usando NDK en forma de bibliotecas o binarios compartidos que tengan Eclipse o Android Studio y escribir código JNI para comunicarse con las bibliotecas o binarios compartidos

Paso 1: Cree archivos de programa c simples.

Calculadora.h

Calculadora.c

Paso 2: Cree un proyecto en Android Studio para agregar dos números.

Paso 3: Cree la clase Java Calculator.java para llamar al Método Native Jni en su aplicación de Android.

Encontrará Agregar error por Android Studio, ignore ese error.

Paso 4: Cree el directorio jni en el directorio principal como se muestra a continuación y pegue Calculator.h , Calculator.c

Paso 5: compile su proyecto de Android Studio, se creará el archivo de clase de su clase Calculator.java en la ubicación

aplicación> compilación> intermedio> clases> depuración> ei> com> myjni

ei> com> myjni : la ruta de acuerdo con el nombre de su paquete estará allí.

Al compilar puede encontrar un error como este

Error: la integración de NDK está en desuso en el complemento actual,

para resolver eso abra su archivo gradle.properties y agregue la línea a continuación

android.useDeprecatedNdk = true

y agrega la ruta de tu ndk en Android studio,

Vaya a Archivo> Estructura del proyecto> Ubicación del SDK> Ubicación del NDK de Android

También establezca la ruta de su NDK. Agregue las siguientes líneas a su archivo .bashrc.

export NDK_PATH = / home / ronak / android-ndk-r13b
export PATH = $ {PATH}: $ {NDK_PATH}

Paso 6: Vaya a la aplicación de directorio de su proyecto > compilación> intermedio> clases> depuración y aplique el siguiente comando

$ javah -jni ei.com.myjni.Calculator

el comando anterior crea el archivo de encabezado ei_com_myjni_Calculator.h y renómbralo con

$ mv ei_com_myjni_Calculator.h jniCalculator.h

copie jniCalculator.h al directorio jni

jniCalculator.h

============================== NOTA: ================== =========

El nombre de esta función c se puede dividir en partes. La primera parte es la información antes del nombre del método. Esto se enumera a continuación.
1. la macro JNIEXPORT
2. el tipo de retorno para el método (‘int’ en este ejemplo)
3. la macro JNICALL
Después de eso viene el nombre real del método. El nombre se puede dividir en partes. Se enumeran a continuación. Las partes están separadas por guiones bajos.
1. el texto ‘Java_’
2. el texto para el nombre del paquete de la aplicación de Android, con los puntos reemplazados por guiones bajos
3. el nombre de la clase de la que formará parte la función
4. el nombre de la función

Los argumentos:
• JNIEnv *: referencia al entorno JNI, que le permite acceder a todas las funciones JNI.
• jobject: referencia a “este” objeto Java.

Esto es seguido por los dos parámetros obligatorios ‘JNIEnv * env’ y ‘jobject obj’. Otros parámetros para la función podrían haber seguido los obligatorios enumerados anteriormente.

La “C” externa es reconocida únicamente por el compilador de C ++. Notifica al compilador de C ++ que estas funciones deben compilarse utilizando el protocolo de denominación de funciones de C (en lugar del protocolo de denominación de C ++). C y C ++ tienen diferentes protocolos de denominación de funciones, ya que C ++ admite la sobrecarga de funciones y utiliza un esquema de cambio de nombre para diferenciar las funciones sobrecargadas.

Paso 7: Cree un archivo wrapper c en el directorio jni para el código jni c y llame al método c a partir de eso.

jniCalculator.c

Paso 8: Cree el archivo ‘Android.mk’ en el directorio jni.

Antes de que las herramientas de compilación de NDK compilen su código, necesitan un archivo ‘Makefile’. Ese es el propósito del archivo ‘Android.mk’. Debido a que nuestro proyecto solo usa un único archivo fuente para la biblioteca JNI, nuestro archivo ‘Android.mk’ será fácil de escribir. Puede encontrar información sobre cómo escribir el archivo ‘Android.mk’ en la carpeta ‘docs’ dentro de la carpeta ‘android-ndk-r4b’ (su carpeta NDK). El documento más relevante es el ‘ANDROID-MK.TXT’, y este documento hace un trabajo minucioso de explicar las partes del archivo que se requieren.

Android.mk

========================== NOTA ======================= ===========

A los fines de este tutorial, dejaremos la mayor parte del archivo tal como está.

• LOCAL_PATH: esta línea debe dejarse como está, ya que su archivo fuente (‘ejemplo.c’) está en el mismo directorio que el archivo ‘Android.mk’.
• include $ (CLEAR_VARS): esta línea debe dejarse como está. Es requerido.
• LOCAL_MODULE: esta línea debe cambiarse para que coincida con el nombre de su módulo. Para este tutorial lo cambiaremos a ‘TestCal’. Este nombre no debe tener espacios, ya que se convertirá en el nombre real de la biblioteca (‘libTestCal.so’ para nosotros).
• LOCAL_CFLAGS: esta línea se puede dejar como está. Es para las banderas del compilador.
• LOCAL_SRC_FILES: esta línea debe cambiarse a ‘example.c’ ya que ese es nuestro archivo fuente.
• LOCAL_LDLIBS: deje esto igual.
• incluye $ (BUILD_SHARED_LIBRARY): déjalo igual.

Application.mk

Paso 9: cambios en el archivo graddle

como se muestra arriba, resaltado en líneas rojas, realice cambios en su archivo build.graddle de acuerdo con su proyecto
ndk {} : nombre de la biblioteca, en nuestro caso “TestCal”
sourceSet.main {} : la biblioteca predeterminada para el estudio es jniLibs, la cambiaremos a libs ya que ndk-build creará el directorio libs para los archivos de la biblioteca
task ndkBuild (type: Exec) {} y task.withType (JavaCompile) {} : contiene la ruta ndk para compilar y compila nuestro código nativo con compilación java

Paso 10 : Cree un objeto de la clase Calculadora en su actividad principal

MainActivity.java