O Java Native Interface (JNI) permite que o código rodando na Java Virtual Machine (JVM) interaja com aplicações e bibliotecas escritas em linguagens como C e C++. No desenvolvimento Android, essa técnica é amplamente utilizada para otimização de performance ou utilização de bibliotecas legadas.
1. Definição da Classe Java com Métodos Nativos
O primeiro passo consiste em criar uma classe que servirá como ponte entre o código Java/Kotlin e o código nativo. É necessário declarar o método com a palavra-chave native e carregar a biblioteca compartilhada.
package com.dev.exemplo.jni;
public class NativeBridge {
// Declaração do método nativo
public native String obterMensagemNativa();
static {
// O nome deve coincidir com o definido no build.gradle
System.loadLibrary("bridge-lib");
}
}
2. Geração do Arquivo de Cabeçalho (.h)
Após criar a classe, é necessário compilar o projeto para gerar o arquivo .class. Com o arquivo compilado, utiliza-se a ferramenta de linha de comando para gerar o header C que define a assinatura das funções.
- Navegue até o diretório onde os arquivos compilados residem (geralmente em
app/build/intermediates/javac/debug/classes). - Execute o comando para gerar o arquivo de cabeçalho:
javah com.dev.exemplo.jni.NativeBridge
Isso resultará em um arquivo nomeado como com_dev_exemplo_jni_NativeBridge.h, que contém a estrutura necessária para a implementação em C.
3. Implementação do Código em C
Crie um diretório chamado jni dentro de app/src/main/. Mova o arquivo .h para esta pasta e crie um arquivo de implementação (ex: bridge.c).
#include <jni.h>
#include "com_dev_exemplo_jni_NativeBridge.h"
/*
* Implementação da função declarada no header.
* A nomenclatura deve seguir o padrão Java_pacote_classe_metodo.
*/
JNIEXPORT jstring JNICALL Java_com_dev_exemplo_jni_NativeBridge_obterMensagemNativa
(JNIEnv *env, jobject obj) {
return (*env)->NewStringUTF(env, "Resposta enviada do ambiente nativo via JNI");
}
4. Configuração do Ambiente Gradle
Para que o Endroid Studio compile o código C, é preciso configurar o suporte ao NDK no arquivo build.gradle (nível de módulo app).
defaultConfig {
applicationId "com.dev.exemplo.jni"
minSdkVersion 21
targetSdkVersion 33
ndk {
// Define o nome da biblioteca (.so)
moduleName "bridge-lib"
// Adiciona suporte a logs nativos, se necessário
ldLibs "log"
// Filtra as arquiteturas desejadas
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}
}
5. Ajustes de Compatibilidade
Em versões específicas do ambiente de desenvolvimento, pode ser necessário habilitar o uso de ferramentas legadas do NDK. Para isso, adicione a seguinte linha ao arquivo gradle.properties:
android.useDeprecatedNdk=true
Após realizar essas configurações, sincronize o projeto com os arquivos Gradle. Agora, ao instanciar a classe NativeBridge e chamar o método obterMensagemNativa(), o Android executará a lógica implementada no arquivo C.