Peter van der LindenEvangelista da tecnologia Android
Plataformas e serviços para desenvolvedores
Brasil - #appsum11br
Motorola Mobility
Gráficos cada vez mais rápidos:utilização de NDK e Renderscript
2Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
1 INSTALANDO AS FERRAMENTAS
2 ESCREVA UM CÓDIGO C
3 CRIE UM CÓDIGO C
4 CHAMANDO C A PARTIR DE JAVA (O JNI)
5 RESUMO - Encerrando, Controle de qualidade
Versão 1.0© 2011 Motorola Mobility, Inc.
3Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
POR QUE CÓDIGOS C/C++ NO ANDROID?
• Open GL
• Desempenho
• Portar!
4Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Limitações C++ do NDK
• Originalmente para escrever partes de desempenho crítico de código em C• Você não precisa de abstração OOP para isso (e
a Dalvik VM é bastante rápida, com a compilação JIT desde 2.2)
• O suporte de C++ é um tanto restrito • exceções não são suportadas • bugs conhecidos em invocações do
construtor/destrutor estáticas
• Assim, é mais provável que o código NDK seja escrito em C do que em C++
5Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Arquiteturas de CPU SUPORTADADAS• o NDK suporta dois conjuntos de instruções ARM:
• ARMv5TE (inclui instruções Thumb-1). Esse é o targetpadrão e o código compilado para ele será executado em todos os dispositivos com Android baseado em ARM. Escolha outro target, mudando uma linha no makefile do Application.mk.
• O ARMv7-A (inclui instruções Thumb-2 e VFPv3-D16, com suporte opcional para instruções NEON/VFPv3-D32). O código compilado para ARMv7-A funcionará apenas em dispositivos como o Verizon Droid ou Motorola XOOM que possuem uma CPU v7. O código para NEON sófuncionará em um ARMv7 com suporte para NEON.
• Há uma terceira arquitetura "em construção" (experimental, sem suporte):
• conjunto de instruções x86
INSTALANDO AS FERRAMENTAS
Versão 1.0MOTOROLA e o logotipo estilizado M são marcas comerciais ou marcas registradas da Motorola Trademark Holdings, LLC. Todas as outras marcas comerciais são propriedade dos seus respectivos proprietários. © 2011 MotorolaMobility, Inc. Todos os direitos reservados.
7Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Baixando o Native Development Kit
• Verifique a compatibilidade: XP ou Vista, MacOS X 10.5, Ubuntu
• Baixe o arquivo zip de 50 MB ou tar.bz2 em:http://developer.android.com/sdk/ndk/index.html
• Faça a descompactação dele em qualquer lugar, lembre-se de onde em $NDK
export NDK=~/android-ndk-r5b
• Requer o GNU make e GNU awk! Usuários do Windows -instalar o Cygwin 1.7 ou mais recente
8Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Usuários do Windows
• Baixe e instale o Cygwin 1.7 ou mais recente• Ferramentas de linha de comando Unix/Linux para
usuários do Windowshttp://cygwin.com
9Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Dicas para Windows e MacOS X
• Não use nomes de caminhos com espaços entre eles! Em qualquer lugar!
• O Cygwin instala somente os pacotes básicos.• Você precisa dos pacotes de desenvolvimento. É simples
instalar todo o branch “Devel”. 1. Execute o setup.exe.2. Clique na palavra “Default” (Padrão) próxima ao nó
da raiz “Devel”. 3. “Default” altera para “Install” para o nó Devel.4. Clique em “next” (Avançar) para instalar. Vá almoçar
enquanto a instalação é realizada.5. Deixe-o criar um ícone do console cygwin na sua área
de trabalho.6. Digite "make -v" no console cygwin para verificar se
está tudo OK.
10Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Descompacte o Native Development Kit
• Contem sete pastas, e uma série de coisas para ler:
11Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Pastas NDK
• build: 4 pastas de scripts awk e shell, makefiles para compilar os seus arquivos C/C++
• docs: cerca de 20 arquivos de texto (Perguntas frequentes sobre o NDK); acesse pelo navegador o arquivo documentation.html
• plataforms: .h e arquivos de sistema library.so para os vários níveis de API• samples: uma série de exemplos de funcionamento• sources: algumas fontes para os elementos relacionadas ao sistema• tests: scripts para testar o próprio NDK. Provavelmente aqui por engano.• toolchains: toolchains de cross-compiler
12Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Adicionar suporte de C/C++ ao Eclipse
• O Eclipse tem um plug-in para C/C++, assim como para o Android
• Consiga isso usando o Eclipse Help (Ajuda) > Install new software (Instalar novo software)
• Digite http://download.eclipse.org/releases/helios/ no campo “workwith” (trabalhar com) (ou qualquer versão que você usa)
• Advertências comuns sobre proxies de rede no trabalho (defina-os em MOTODEV Studio > Preferences (Preferências) > Network Conn.
(Conexão de rede)
• Clique em Programming Langs (Linguagens de programação) > C/C++ Development Tools (Ferramentas de desenvolvimento)
13Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
• Há um plugin para C/C++, assim como para o Android
• Consiga isso usando o Eclipse Help (Ajuda)> Install new software
(Instalar novo software)
Escreva seu código C
MOTOROLA e o logotipo estilizado M são marcas comerciais ou marcas registradas da Motorola Trademark Holdings, LLC. Todas as outras marcas comerciais são propriedade dos seus respectivos proprietários. © 2011 MotorolaMobility, Inc. Todos os direitos reservados.
15Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Abordagem geral
•Comece com um aplicativo Android em Java, e adicione pedaços NDK a ele.
•Coloque sua fontes C/C++ nativas em $PROJECT/jni:
•Crie o seu código nativo em bibliotecas (libraries).
•Seu código Java do Android pode chamar código nessas bibliotecas nativas.
•O código nativo também pode chamar de volta em Java, e acesso objetos Java.
16Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Criar o projeto Androidda maneira usual
17Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Crie a pasta jni para seu projeto
• Destaque o projeto Eclipse que usará o código nativo
• O nome do seu pacote é usado para acessar o código nativo, então mantenha-o curto e simples, por exemplo, "com.greet" para propósitos de treinamento
• File (Arquivo) > New (Novo) > Folder (Pasta) • atribua-lhe o nome de "jni"
• Dentro dessa pasta jni recém-criada, nós adicionaremos • um makefile• alguns arquivos C
18Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Adicione dois arquivos à pasta jni em seu projeto
• File (Arquivo) > New (Novo) > Other (Outro) ...
• Selecione General (Geral), File (Arquivo) e, em seguida, procurar
• Escolha a pasta jni, com o nome de "Android.mk“ > Finish (Finalizar)
• Repita, criando um arquivo "myhello.c", também na pasta jni
• Isso oferece a você
• jni/Android.mk• jni/myhello.c
19Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Preencha a pasta jni em seu projeto
saudar
Criando arquivos na pasta jni
20Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Criando mkfile na pasta jni
21Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Preencha o makefile Android.mk
• Edite o arquivo jni/Android.mk que você acabou de criar• Coloque essas palavras mágicas no makefile
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# nosso arquivofonte e a biblioteca criada# a partirdeleLOCAL_MODULE := helloLOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)
22Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Desvio em relação ao make
• O make foi criado por Stu Feldman em 1977, no Bell Labs
• Em 2003, o Dr. Feldman recebeu o prêmio ACM Software SystemAward pela criação dessa ferramenta amplamente difundida.
• Você não ficou sabendo disso por mim, mas a tradição de software diz que...
# Cada comando que segue a linha de dependência, # ou seja, o TARGET à esquerda, deve ser indentado por um# caracter TAB.
target: componente-a-construir<TAB>comandos-para-construi-lo
23Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Crie o código C na pasta jni
•Edite o arquivo jni/myhello.c que você acabou de criar
•Coloque essas palavras mágicas no arquivo C
•Usa o objeto JNIEnv para criar uma string de Java a partir de um literal
#incluir <string.h>#incluir <jni.h>
jstring Java_com_greet_MyActivity_myCFunction(JNIEnv* env, jobject javaThis) {
return (*env)->NewStringUTF(env, "Hello from native code!");}
24Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Código C explicadoQuando o JVM invoca uma função nativa, ele passa• um indicador JNIEnv (estrutura que tem a interface da JVM para C)• um ponteiro jobject (o objeto "this")• quaisquer argumentos de Java declarados pelo método Java.
Esses tipos vêm de #include <jni.h> (veja em "plataforms")Seu método de C deve ser escrito para esperar esses argumentosO método C é chamado de "Java“_classname_activity_methodname
• ... parece, mas não é, um vazamento de memória?
#incluir <string.h>#incluir <jni.h>
Jstring Java_com_greet_MyActivity_myCFunction(JNIEnv* env, jobject javaThis) {
return (*env)->NewStringUTF(env, "Hello from native code!");}
Crie um código C
MOTOROLA e o logotipo estilizado M são marcas comerciais ou marcas registradas da Motorola Trademark Holdings, LLC. Todas as outras marcas comerciais são propriedade dos seus respectivos proprietários. © 2011 MotorolaMobility, Inc. Todos os direitos reservados.
26Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Chamadas entre linguagens
•O Android segue o caminho normal para falar entre Java e C
•JNI – Java Native Interface
•Link para documentação do JNI http://java.sun.com/docs/books/jni/
•Isso inclui um livro completo, um tutorial, exemplos, etc
27Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Crie uma biblioteca C• Abra uma janela de terminal, e cd para a pasta do projeto jni• Use o script "NDK-build" do diretório NDK (apenas um invólucro GNU
Make) (pode colocar $NDK em seu caminho, se você quiser)• O script compila o código C, o transforma em uma biblioteca
compartilhada (“shared library”)• Move o libhello.so para um novo projeto de pasta libs/armeabi
28Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Abordagem geral para a construção de uma biblioteca
• Salve arquivos no Eclipse• Abra uma janela de terminal e cd na pasta jni do seu projeto• Execute o script NDK-build para transformar o seu código em C
em um arquivo .so• Essa lib *. so será adicionada no arquivo do aplicativo APK.• File (Arquivo) > Refresh (Atualizar) no Eclipse (para sincronizar
com o sistema de arquivos)
$ cd MYECLIPSEPROJECT/jni$ $NDK/ndk-build
Compile thumb : hello <= hello.cSharedLibrary : libhello.soInstall : libhello.so => libs/armeabi/libhello.so
29Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
CRIE SUA BIBLIOTECA: resumo
• O Eclipse não compila seu código NDK, o GNU Make sim
• O plugin C/C++ dá-lhe as cores de sintaxe e de edição (apenas)
• Execute o "NDK-build " script após cada edição de seu código C
• Depois clique em File > Refresh, (F5), para manter o Eclipse em sincronia com seus arquivos nativos
O Lado Java do JNI
MOTOROLA e o logotipo estilizado M são marcas comerciais ou marcas registradas da Motorola Trademark Holdings, LLC. Todas as outras marcas comerciais são propriedade dos seus respectivos proprietários. © 2011 MotorolaMobility, Inc. Todos os direitos reservados.
31Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Código Java que chama para o código nativo
• Comece com o aplicativo de base criado no Eclipse
package com.greet;
import android.app.Activity;import android.os.Bundle;
public class MyActivity extends Activity {/** Chamado quando a Activity écriada pela primeira vez. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);
}}
32Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Adicione o carregamento da biblioteca
• Adicione a chamada para carregar a nossa biblioteca nativa libhello.so
• o nome deve corresponder ao nome da biblioteca sem “lib” e “.so”
• assim libhello.so é "hello"static {
System.loadLibrary("hello");}
33Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Adicione a declaração da função nativa
• Adicione a declaração de protótipo da função nativa
• No lado C, ela tem dois argumentos explícitos, um envp, um this
• Mas no lado Java, esses argumentos estão implícitos
private native String myCFunction();
34Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Adicione a chamada para a função nativa
• Nós pegaremos a string de C e exibiremos alertas para o usuário (usando um “toast”).
import static android.widget.Toast.*;import android.widget.Toast;
. . .
String msg = myCFunction();Toast.makeText(this, msg, LENGTH_LONG).show();
35Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Juntando tudopackage com.greet;
import android.app.Activity;import android.os.Bundle;import static android.widget.Toast.*;import android.widget.Toast;
public class MyActivity extends Activity {
static { System.loadLibrary("hello"); }
private native String myCFunction();
@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);
String msg = myCFunction();
Toast.makeText(this, msg, LENGTH_LONG).show();}
}
36Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Resumo
38Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
O COMEÇO
Este pode ser um belo começo para um longo caminho
• http://groups.google.com/group/android-ndk/topics
• http://java.sun.com/docs/books/jni/
• http://developer.android.com/sdk/ndk/index.html
39Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011 Página
Versão 1.0© 2010 Motorola Mobility, Inc.
Renderscript• Nova API com gráficos 3D de alto
desempenho
• Foi usada no Froyo para papéis de parede animados
• É usada no Honeycomb para as appsBooks e YouTube
• O Honeycomb apresenta o Renderscript como uma API pública
• Para executar códigos críticos em que as APIs de estrutura tradicionais Open GL ES não são rápidas o suficiente!
40Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011 Página
Versão 1.0© 2010 Motorola Mobility, Inc.
Exemplo de renderscript
41Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011 Página
Versão 1.0© 2010 Motorola Mobility, Inc.
App Books e Renderscript
42Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011 Página
Versão 1.0© 2010 Motorola Mobility, Inc.
API do Renderscript
• Uma API de "computação" para localizar pontos de movimento em 3D
• Um API de "renderização" para desenhar texturas sobre os pontos
• Uma linguagem de script baseada em C para acessar essa API
• Único objetivo: espremer até a última gota de desempenho gráfico!
• Abordagem: a API é uma fina camada sobre os recursos que são suportados pelo hardware
• http://community.developer.motorola.com/t5/MOTODEV-Blog/Introduction-to-Renderscript/ba-p/12136
43Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011 Página
API do Renderscript
• As ferramentas de construção do Android compilam seu arquivo .rs do Renderscript para bytecode intermediário.
• e o empacota no arquivo .apk do seu aplicativo.
• No dispositivo, o bytecode é compilado (durante a execução - JIT) para código de máquina, que é otimizado para o dispositivo exato em que está sendo executado
• O código de máquina é armazenado em cache para uso futuro
• Isso elimina a necessidade de destinar uma arquitetura específica durante o processo de desenvolvimento. Excelente!
44Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011 Página
Versão 1.0
Exemplo de arquivo .rs (a partir de exemplos do Honeycomb)
#pragma rsjava_package_name(com.android.rs.helloworld)#include "rs_graphics.rsh"// Headers com APIs gráficas
// gTouchX e gTouchY são variáveisque serão obtidas através de// reflexão para o uso pela API java. Podemos usá-las para notificar// o script de eventos de toque.intgTouchX;intgTouchY;
// Esse éinvocado automaticamente quando o script é criadovoid init() {
gTouchX = 50.0f;gTouchY = 50.0f;
}
introot(intlaunchID) {// Apaga a cor do planofundorsgClearColor(0.0f, 0.0f, 0.0f, 0.0f);// Informa o runtime que a cor dafonte deveterrsgFontColor(1.0f, 1.0f, 1.0f, 1.0f);//Nos apresentaao mundo esboçando uma saudação// no local em que o usuáriotocou a telarsgDrawText("Hello World!", gTouchX, gTouchY);
// O valor de retornoinforma ao RS aproximadamente quantas vezes// redesenhar; nesse caso 20 msreturn 20;
}
45Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Perguntas?@motodev
@motodevbr
Brasil - #appsum11brArgentina - #appsum11arMéxico - #appsum11mx
Atendimento on lineTerca-feira, 2 de junho
14 hs Sao Paulo, Buenos Aires12 hs Cidade do Mexico
46Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
obrigado
47Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
Licenças
Os exemplos de código fonte exibidos nessa apresentação podem ser licenciados sob a Licença Apache, Versão 2 da seguinte maneira:
Copyright © 2010, Android Open Source Project. Todos os direitos reservados, exceto onde expressamente indicado o contrário.
Licenciado sob a Licença Apache, Versão 2.0 (a "Licença"); você não pode usar esse arquivo exceto em conformidade com a Licença. Você pode obter uma cópia da Licença em http://www.apache.org/licenses/LICENSE-2.0.
A menos que exigido pela lei aplicável ou acordado por escrito, o software distribuído sob a Licença édistribuído "NA CONDIÇÃO QUE SE ENCONTRA", SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, sejam expressas ou implícitas. Consulte a Licença para o idioma específico que governam as permissões e limitações sob a Licença.
48Page
© 2011 Motorola Mobility, Inc.
MOTODEV App Summit 2011
LicençasOs exemplos de código fonte exibidos nessa apresentação podem ser licenciados sob a Licença
BSD, da seguinte maneira:
Copyright © 2010-2011, Motorola, Inc. Todos os direitos reservados exceto quando expressamente indicado.A redistribuição e utilização em formas de fonte e binário, com ou sem modificação, são permitidas de acordo com as
seguintes condições:As redistribuições de código fonte devem manter o aviso de direitos autorais acima, esta lista de condições e a seguinte
isenção de responsabilidade.As redistribuições em formulários binários devem reproduzir o aviso de copyright acima, esta lista de condições e a
seguinte isenção de responsabilidade na documentação e/ou outros materiais fornecidos com a distribuição.O nome da Motorola, Inc. e os nomes de seus colaboradores não podem ser usados para endossar ou promover
produtos derivados desse software sem permissão prévia por escrito.
ESTE SOFTWARE É FORNECIDO PELOS DETENTORES E COLABORADORES "COMO TAL" E QUALQUER GARANTIA EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO LIMITADO A, AS GARANTIAS DE COMERCIALIZAÇÃO E ADEQUAÇÃO PARA UMA FINALIDADE ESPECÍFICA. EM NENHUM CASO A TITULAR DO DIREITO OU CONTRIBUINTES DEVEM SER RESPONSÁVEIS POR QUAISQUER DANOS DIRETOS, INDIRETOS, ESPECIAIS, EXEMPLARES OU CONSEQUENTES (INCLUINDO, MAS NÃO SE LIMITANDO À AQUISIÇÃO DE BENS OU SERVIÇOS, PERDA DE USO, DADOS OU LUCROS; OU INTERRUPÇÃO DE NEGÓCIOS) CAUSADOS E SOB QUALQUER TEORIA DE RESPONSABILIDADE, SEJA EM CONTRATO, RESPONSABILIDADE OBJETIVA OU (INCLUINDO NEGLIGÊNCIA OU NÃO) DECORRENTE DE QUALQUER MANEIRA DO USO DO SOFTWARE, MESMO QUE DA POSSIBILIDADE DE TAIS DANOS.