Aprenda a criar bibliotecas com Linguagem C (NDK) e utilizá-las no Android (JNI)

1

Já pensou em criar ou utilizar uma biblioteca (.so) em seu aplicativo ? Pois bem, isso é possível no Android graças ao NDK e JNI. Para entender melhor, vou explicar o que significa cada um.

Segundo a definição oficial do Google, “O Android NDK é um conjunto de ferramentas que lhe permite implementar partes do seu aplicativo usando linguagens de código nativo, como C e C ++. Para certos tipos de aplicativos, isso pode ajudá-lo a reutilizar bibliotecas de código existentes escritas nessas línguas.

Segundo a definição do Wikipédia, “Java Native Interface(JNI) é um padrão de programação que permite que código Java executando em uma máquina virtual Java (JVM) chame ou seja chamado por aplicações nativas (programas específicos para uma plataforma de hardware e sistema operacional) e bibliotecas escritas em outras linguagens, tais como C, C++ e assembler.

Ou seja, com o NDK criamos a biblioteca utilizando linguagem C ou C++ e para acessar essa biblioteca que esta localizada em uma camada mais baixa, precisamos criar uma interface de comunicação, no caso um código em Java com chamadas nativas.

Referência

Para este tutorial, vamos criar um aplicativo que irá exibir a hora do sistema operacional, porém o comando será executado na camada de baixo nível (biblioteca – Linguagem C).

1. Mão na massa

O primeiro passo a tomar é configurar o Android Studio (.gradle) a nível de projeto. Repare que existem dois arquivos com o mesmo nome build.gradle, um deles fica dentro da pasta app, ou seja, esse é o build.gradle nível do módulo, consequentemente o que esta fora é o build.gradle nível de projeto.

Para podermos compilar códigos de linguagem nativa C ou C++ precisamos indicar ao Android Studio para utilizar o gradle experimental. Para isso modifique a dependência do seu build.gradle nível de projeto para:

build gradle nível projeto
Quando utilizamos a versão experimental do gradle, precisamos alterar também alguns detalhes no build.gradle nível de módulo. Mais detalhes sobre o que precisa ser alterado pode ser encontrado na documentação oficial do Google, Clique aqui para visualizar.

No código abaixo temos o build.gradle nível de módulo e note que adicionamos a propriedade ndk e nela especificamos o nome do nosso módulo ou biblioteca, ou seja, ao compilar o projeto será criado a biblioteca com o nome libhello-jni.so. Este arquivo pode ser encontrado em JNI/app/build/intermediates/binaries/debug/all/lib .

build gradle nível módulo
Neste ponto temos nosso ambiente preparado para compilar códigos nativos escritos em Linguagem C.

O objetivo deste tutorial não é ensinar a linguagem C e sim demonstrar a possibilidade da comunicação entre a camada e aplicação e bibliotecas nativas.

Crie um arquivo chamado data.c dentro da pasta jni e adicione o seguinte código.

Código em C para obter horário

OBS.: Repare que criamos o método chamado getDateFromJNI cujo retorno é uma String (jstring) e seguindo o padrão JNI precisamos começar sempre com Java_ seguido do caminho completo do arquivo onde será utilizado o método sem o .java e separado por _ (underline) br_com_tutorialandroid_jni_MainActivity e no final será o nome do nosso método getDateFromJNI. Clique aqui para maiores detalhes sobre o padrão JNI.

Agora que temos nossa biblioteca criada precisamos criar uma forma de utilizá-la, para isso vamos criar o código JNI. O primeiro passo é dizer qual biblioteca vamos utilizar com o seguinte comando:

agora precisamos dizer qual método nativo deverá ser chamado e para isso precisamos criar o seguinte código:

Pronto, agora só falta chamar esse método em algum lugar, lembrando que ele deverá retornar uma String com os dados da hora obtida pela biblioteca.

2. Código Completo

Código Fonte

Clique aqui para baixar o projeto completo.

Qualquer dúvida deixe seu comentário.

Share.

About Author

gorio

Engenheiro de Computação, com 6 anos de experiência e vivência no mundo de Sistemas Embarcados e Mobile.