Android NDK: Desmistificando o acesso a códigos nativos em C

Acredito que quase todo usuário da plataforma Android provavelmente já questionou como é possível algumas aplicações gráficas apresentarem tamanha performance, mesmo com modelos de equipamentos que apresentam o mais modesto hardware e/ou versão do Android? O NDK (Native Development Kit) é a resposta para todas estas dúvidas e muitas outras.

[ Hits: 39.794 ]

Por: Alessandro de Oliveira Faria (A.K.A. CABELO) em 16/02/2011 | Blog: http://assuntonerd.com.br


Mão na massa! Criando o Hello Word com JNI



A técnica de abstração de funções C e/ou classes em C++ é denominada JNI, ou Java Native Interface, é um padrão de programação que permite que a máquina virtual da linguagem Java acesse bibliotecas construídas com o código nativo de um sistema. Junto ao recurso do NDK para compilação cruzada, céu é o limite para as pessoas que não conhecem os seus limites.

Chega de blá-blá-blá e começaremos agora a colocar a mão na massa, selecionando a opção File->New->Project conforme a figura abaixo.
Na nova janela de diálogo, selecione a opção Android Project.
Logo a seguir, informe o nome do projeto no EditBox project name, selecione o item "Create new project in workspace", habilite o item "Use default location" para criar no workspace padrão e por fim a versão do SDK. Na figura a seguir veremos um exemplo ilustrativo.
Informe o nome da aplicação, o nome do pacote e também o nome da Acticity.
Edite o arquivo main.xml localizado na pasta layout, conforme o exemplo abaixo:
Altere a classe HelloNDK conforme o exemplo abaixo, onde a função nativa sayHello() retorna uma string java que posteriormente será exibida na aplicação. Reparem que a chamada da biblioteca nativa hellondk é efetuada com System.loadLibrary.

package com.cabelo.hellondk;

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

public class HelloNDK extends Activity {
   TextView txtHello;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      txtHello = (TextView) findViewById(R.id.txtHello);
      String hello = sayHello();
      txtHello.setText(hello);
      }

   public native String sayHello();
   static {
      System.loadLibrary("hellondk");
      }
}

Salve o projeto e no modo console (\o/ viva!), entre na pasta do projeto com o comando cd.

cd ~/workspace/olaNDK/

Utilizaremos o javah, um gerador de arquivos header para integração a código nativo em C. Este programa possibilita que programas escritos em Java façam chamadas de procedimentos escritos em C. A sua sintaxe é composta do arquivo de saída precedido da classe java como no exemplo abaixo:

javah -o hellondk.h -classpath bin com.cabelo.hellondk.HelloNDK

Agora crie a pasta jni e mova o arquivo .h criado anteriormente para a pasta recém-criada.

mkdir jni
$ mv hellondk.h jni/


Entre na pasta jni e cria o arquivo Application.mk informando a arquitetura de processador a utilizar.

cd jni/
$ echo "APP_ABI := armeabi armeabi-v7a" > Application.mk


A seguir, crie também o arquivo Android.mk com o conteúdo do exemplo abaixo.

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

#I Like to build my shared libs using C++
LOCAL_DEFAULT_CPP_EXTENSION := cpp

LOCAL_MODULE := hellondk
LOCAL_SRC_FILES := hellondk.cpp

include $(BUILD_SHARED_LIBRARY)

Agora falta criar apenas o arquivo hellondk.cpp, cujo conteúdo é na integra a abstração C em Java, ou seja, como prova de conceito, retornaremos uma string java oriunda da junção sayHello. No exemplo a seguir, o conteúdo do arquivo hellondk.cpp.

#include <hellondk.h>

JNIEXPORT jstring JNICALL Java_com_cabelo_hellondk_HelloNDK_sayHello(JNIEnv *env, jobject obj){
                  return env->NewStringUTF("Viva o Linux com NDK!");
                    }

Para compilar, basta utilizar o script ndk-build no NDK:

/dados/neti/programas64/android-ndk-r5/ndk-build
StaticLibrary  : libstdc++.a
SharedLibrary  : libhellondk.so
Install        : libhellondk.so => libs/armeabi/libhellondk.so
StaticLibrary  : libstdc++.a
SharedLibrary  : libhellondk.so
Install        : libhellondk.so => libs/armeabi-v7a/libhellondk.so

Pronto, agora basta voltar no Eclipse, abrir o aplicativo Java e executá-lo. Se tudo estiver funcionando corretamente, teremos um resultado conforme a imagem a seguir...
Espero que este documento ajude a desmistificar o uso do NDK na plataforma Android, principalmente para os iniciantes. Como sempre menciono... Colaborar atrai amigos, competir atrai inimigos...
Sobre o autor: http://www.netitec.com.br/alessandro

Página anterior    

Páginas do artigo
   1. Introdução e instalação
   2. Mão na massa! Criando o Hello Word com JNI
Outros artigos deste autor

Terasology: O Minecraft gratuito e com gráfico realista

Membro da comunidade Viva O Linux na Espanha

Android Things - Aplicativos IoT padronizado para Indústria 4.0

Instalando Ubuntu Touch no seu celular (Linux de bolso)

Gerando em tempo real efeito de voz robotizada

Leitura recomendada

Programação de Jogos com SDL

SDL e C - Uma dupla sensacional

Compilando Templates C++

Como funcionam os alocadores de memória do STD C?

Desenvolvendo um plugin de visualização para o XMMS (Parte 1)

  
Comentários
[1] Comentário enviado por removido em 16/02/2011 - 12:28h

Fala cara. Muito bom o artigo !


Abraço.

[2] Comentário enviado por julio_hoffimann em 18/02/2011 - 00:08h

Oi Alessandro,

Como sempre muito conteúdo! Parabéns!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts