gráficos cada vez mais rápidos utilização de ndk e renderscript

Post on 27-May-2015

1.315 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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.

top related