Integração de Código Nativo com JNI no Android Studio

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.

  1. Navegue até o diretório onde os arquivos compilados residem (geralmente em app/build/intermediates/javac/debug/classes).
  2. 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.

Tags: android JNI NDK C java

Publicado em 7-15 02:01