Generación y uso de la biblioteca de interfaz Android JNI

Tabla de contenido

1. Genere la biblioteca de interfaz JNI:

1. Creación de proyectos

2. Creación e implementación de clases Java

3. Genere el archivo de encabezado de C++ correspondiente a través de javac -h

4. Realice la función de función en el archivo cpp

5. Compile para obtener la biblioteca so

2. Llame a la biblioteca de la interfaz JNI:

1. Obtenga la biblioteca so provista (y el nombre de la biblioteca), interfaz Java

2. Copie el archivo de clase de la interfaz Java al nombre del paquete correspondiente (si no hay ninguno, créelo)

3. Cree una carpeta para colocar la biblioteca so

4. Agregue la ruta de la biblioteca so al archivo build.gradle y sincronícelo

5. Agregue la importación de la biblioteca en la clase java utilizada


1. Genere la biblioteca de interfaz JNI:

1. Creación de proyectos

Aquí usamos un ejemplo simple para demostrarlo ingresando dos parámetros y devolviendo el resultado de su suma.

Primero cree un proyecto Native C++, por ejemplo, llamado JNILib. La razón por la que elijo enseñar el proyecto Native C++ en lugar de un proyecto vacío es porque generará un directorio CPP con CMakeLists. Por supuesto, también puede agregarlo usted mismo en un proyecto vacío para lograr Efecto.

2. Creación e implementación de clases Java

 Seleccione un paquete en el directorio main/java y luego cree una clase de interfaz Java, como la clase JNILib que creé como se muestra en la figura a continuación, y escriba la declaración de la función de interfaz que queremos proporcionar.

3. Genere el archivo de encabezado de C++ correspondiente a través de javac -h

En la línea de comando del sistema o terminal Android, ingrese al directorio principal/java y ejecute el comando javac -h para generar el archivo de encabezado C++ correspondiente de JNILib.java:

javac -h ./ com/td/jnilib/JNILib.java

 Obtenga el archivo de encabezado de C++ correspondiente: com_td_jnilib_JNILib.h, que tiene el nombre del encabezado del paquete y el nombre de la clase. El contenido del archivo es el siguiente:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_td_jnilib_JNILib */

#ifndef _Included_com_td_jnilib_JNILib
#define _Included_com_td_jnilib_JNILib
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_td_jnilib_JNILib
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_td_jnilib_JNILib_add
  (JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

4. Realice la función de función en el archivo cpp

Copiamos el archivo de encabezado C++ recién generado com_td_jnilib_JNILib.h al directorio CPP, luego agregamos este archivo de encabezado al archivo .cpp e implementamos la función. Como se muestra abajo:

5. Compile para obtener la biblioteca so

Lo anterior ha completado la implementación de la función de la biblioteca so, y ahora, siempre que la compilación sea la siguiente, se puede generar la biblioteca so correspondiente. La biblioteca so se genera en build/intermediates/cmake, como se muestra en la siguiente figura. Al proporcionarlo a otros, debe proporcionar la biblioteca so y los archivos de clase de la interfaz Java.

 

Nota: El nombre de la biblioteca JNI no es necesariamente el nombre del archivo de la biblioteca. El nombre de la biblioteca JNI se configura en add_library en CMakeLists.txt. Cuando se proporciona para que otros lo usen, el nombre de la biblioteca también se cita por otros.

 

2. Llame a la biblioteca de la interfaz JNI:

1. Obtenga la biblioteca so provista (y el nombre de la biblioteca), interfaz Java

Por ejemplo, el proyecto anterior proporciona varias carpetas de biblioteca, clase de interfaz Java JNILib.java, y el nombre de la biblioteca es jnilib.

2. Copie el archivo de clase de la interfaz Java al nombre del paquete correspondiente (si no hay ninguno, créelo)

Ahora necesitamos copiar el archivo de clase de interfaz Java obtenido JNILib.java al proyecto que necesitamos. Lo que debemos prestar atención aquí es copiar el nombre del paquete correspondiente a este archivo de clase de interfaz. Puede verificar el nombre del paquete importado en el clase java.

3. Cree una carpeta para colocar la biblioteca so

Coloque varias carpetas de la biblioteca so en un directorio específico, como jniLibs, y luego configure la siguiente ruta en gradle.

4. Agregue la ruta de la biblioteca so al archivo build.gradle y sincronícelo

Para una configuración específica, puede encontrar buildTypes en el archivo app/build.gradle y agregar la ruta de almacenamiento de la biblioteca so dentro de su alcance, de la siguiente manera. Sincronizar después de agregar:

    sourceSets{
        main{
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }

5. Agregue la importación de la biblioteca en la clase java utilizada

Finalmente, usamos el método JNI para llamar a la función de la biblioteca, y necesitamos agregar la importación de la biblioteca donde la usamos:

    static {
        System.loadLibrary("serialportdemo");
    }

De esta manera, podemos llamar a la API de la biblioteca de interfaz a través de JNI en nuestro archivo java, ¿es muy simple?

 

Supongo que te gusta

Origin blog.csdn.net/huiaifen/article/details/124651288
Recomendado
Clasificación