Índice
1. Gere a biblioteca de interface JNI:
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
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?