View
1.315
Download
4
Category
Preview:
Citation preview
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.
Recommended