Aplicações Nativas (C/C++) no Android

qrcodeEm alguns casos quando é necessário um controle fino de alocação e desalocação de memória, por exemplo, em trechos com estruturas de dados específicas e onde o desempenho através do controle do uso de memória é essencial, o Android oferece o mesmo recurso que o Java SE (JNI) para chamadas de código nativo na plataforma. Esse tipo de recurso deve ser utilizado com cautela, pois aumenta a complexidade do projeto e nem sempre aumenta o desempenho da aplicação. Caso você saiba o que está fazendo e as implicações do uso da linguagem C/C++ com o uso de ponteiros e alocação e desalocação de memória você poderá utilizar o Android NDK para isso.

Baixe o Android NDK no site: http://developer.android.com/sdk/ndk/index.html. Descompacte em uma pasta e coloque-o no seu PATH modificando o arquivo ~/.bashrc

export PATH=${PATH}:$ANDROID_NDK

Substitua $ANDROID_NDK pelo diretório onde você descompactou o NDK.

Para configurar no Eclipse com o plugin da MOTOROLA (instruções de instalação nesse post). Clique em MOTODEV, Download Components..., Native Support e clique no checkbox "Enable native support". Informe o caminho do JDK. Aguarde a instalação e clique OK. Da próxima vez que acessar você deverá ter a seguinte tela.

Download components
Download components

Vá em Window, Preferences, Android, Native Development e informe a localização do NDK e clique OK.

Preferences
Preferences

Para adicionar suporte à programação nativa no seu projeto, é só ir clicar com o botão direito no projeto, Android Tools e Add Native Support... Informe os dados do projeto e clique em Finish.

Add Android Native Support
Add Android Native Support

Ele poderá pedir pra você trocar para a perspectiva Android Native para facilitar o desenvolvimento. Para testar, utilizei o exemplo que vem na pasta samples do NDK, que consiste em exibir uma String via JNI. Podemos programar em C/C++ normalmente, sendo apenas necessário utilizar o include jni.h para utilizar as estruturas necessárias para a comunicação com o Java. O código em C/C++ é o seguinte.

#include <string.h>
#include <jni.h>

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}

E a chamada no Activity em Java

package com.example.hellojni;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;

public class HelloJni extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        setContentView(tv);
    }

    public native String  stringFromJNI();

    static {
        System.loadLibrary("hello-jni");
    }
}

Na linha 21 a biblioteca nativa é carregada. Na linha 18 declaramos o método native e na linha 14 invocamos ele. Verifique também o nome da função em C/C++ com o pacote da classe Java. Agora é só começar a codificar.

Use com moderação :).

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6