Geração e uso da biblioteca de interface Android JNI

Índice

1. Gere a biblioteca de interface JNI:

1. Criação do projeto

2. Criação e implementação de classe Java

3. Gere o arquivo de cabeçalho C++ correspondente por meio de javac -h

4. Realize a função de função no arquivo cpp

5. Compile para obter a biblioteca so

2. Chame a biblioteca de interface JNI:

1. Obtenha a biblioteca so fornecida (e o nome da biblioteca), interface Java

2. Copie o arquivo de classe da interface Java para o nome do pacote correspondente (se não houver, crie-o)

3. Crie uma pasta para colocar a biblioteca so

4. Adicione o caminho da biblioteca so ao arquivo build.gradle e sincronize-o

5. Adicione o import da biblioteca na classe java utilizada


1. Gere a biblioteca de interface JNI:

1. Criação do projeto

Aqui usamos um exemplo simples para demonstrar inserindo dois parâmetros e retornando o resultado de sua adição.

Primeiro, crie um projeto Native C++, por exemplo, chamado JNILib. A razão pela qual escolhi ensinar o projeto Native C++ em vez de um projeto vazio é porque ele gerará um diretório CPP com CMakeLists. Claro, você também pode adicioná-lo você mesmo em um projeto vazio para alcançar o efeito.

2. Criação e implementação de classe Java

 Selecione um pacote no diretório main/java e, em seguida, crie uma classe de interface Java, como a classe JNILib que criei, conforme mostrado na figura abaixo, e escreva a declaração de função de interface que desejamos fornecer.

3. Gere o arquivo de cabeçalho C++ correspondente por meio de javac -h

No terminal Android ou na linha de comando do sistema, insira o diretório main/java e execute o comando javac -h para gerar o arquivo de cabeçalho C++ correspondente de JNILib.java:

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

 Obtenha o arquivo de cabeçalho C++ correspondente: com_td_jnilib_JNILib.h, que é nomeado com o cabeçalho do nome do pacote e o nome da classe. O conteúdo do arquivo é o seguinte:

/* 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. Realize a função de função no arquivo cpp

Copiamos o arquivo de cabeçalho C++ recém-gerado com_td_jnilib_JNILib.h para o diretório CPP, adicionamos esse arquivo de cabeçalho ao arquivo .cpp e implementamos a função. Como mostrado abaixo:

5. Compile para obter a biblioteca so

O acima concluiu a implementação da função da biblioteca so e agora, desde que a compilação seja a seguinte, a biblioteca so correspondente pode ser gerada. A biblioteca so é gerada em build/intermediates/cmake, conforme mostrado na figura abaixo. Ao fornecê-lo a outros, você precisa fornecer a biblioteca so e os arquivos de classe da interface Java.

 

Observação: o nome da biblioteca JNI não é necessariamente o nome do arquivo da biblioteca. O nome da biblioteca JNI é configurado em add_library em CMakeLists.txt. Quando é fornecido para uso de outras pessoas, o nome da biblioteca também é citado por outros.

 

2. Chame a biblioteca de interface JNI:

1. Obtenha a biblioteca so fornecida (e o nome da biblioteca), interface Java

Por exemplo, o projeto anterior fornece várias pastas de bibliotecas so, classe de interface Java JNILib.java e o nome da biblioteca é jnilib.

2. Copie o arquivo de classe da interface Java para o nome do pacote correspondente (se não houver, crie-o)

Agora precisamos copiar o arquivo de classe de interface Java JNILib.java obtido para o projeto que precisamos. O que precisamos prestar atenção aqui é copiar o nome do pacote correspondente a este arquivo de classe de interface. Você pode verificar o nome do pacote importado no classe java.

3. Crie uma pasta para colocar a biblioteca so

Coloque várias pastas da biblioteca so em um diretório especificado, como jniLibs, e configure o seguinte caminho no gradle.

4. Adicione o caminho da biblioteca so ao arquivo build.gradle e sincronize-o

Para configuração específica, você pode encontrar buildTypes no arquivo app/build.gradle e adicionar o caminho de armazenamento da biblioteca so em seu escopo, conforme a seguir. Sincronizar após adicionar:

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

5. Adicione o import da biblioteca na classe java utilizada

Por fim, utilizamos o método JNI para chamar a função da biblioteca, e precisamos adicionar o import da biblioteca onde utilizamos:

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

Desta forma, podemos chamar a API da biblioteca de interfaces através do JNI em nosso arquivo java, é muito simples?

 

Acho que você gosta

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