Programação com OpenGL/Instalação/Android NDK: diferenças entre revisões

[edição verificada][revisão pendente]
Conteúdo apagado Conteúdo adicionado
Abacaxi (discussão | contribs)
Sem resumo de edição
m <source> -> <syntaxhighlight> (phab:T237267)
 
Linha 13:
Este documento foi feito usando o Android NDK r7c.
Você também precisará de um ambiente de desenvolvimento em Java:
<sourcesyntaxhighlight lang="bash">
sudo aptitude install openjdk-6-jdk ant
</syntaxhighlight>
</source>
 
Seu programa também vai precisar do GLM e FreeType - veja nas seções dedicadas abaixo.
Linha 45:
(Isto pode ser melhorado com o idProduct.)
Em seguida reinicie o serviço udev:
<sourcesyntaxhighlight lang="bash">
/etc/init.d/udev restart
</syntaxhighlight>
</source>
 
Se você plugar seu dispositivo, o carácter USB do dispositivo deverá aparecer no grupo "plugdev":
Linha 78:
== Tela Cheia ==
Para fazer um aplicativo de tela cheia, adicione os seguintes atributos em sua AndroidManifest.xml
<sourcesyntaxhighlight lang="xml">
<application
...
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
>
</syntaxhighlight>
</source>
 
== Teclado ==
Linha 96:
 
Certifique-se que seu aplicativo possua o <code>android:icon</code> definido em <code>AndroidManifest.xml</code>:
<sourcesyntaxhighlight lang="xml">
<application ...
android:icon="@drawable/icon"
</syntaxhighlight>
</source>
 
Crie dois icones:
Linha 111:
se você quer ver as saídas padrão (stdout e stderr) do seu programa, você precisa redirecionar para o log do sistema:
 
<sourcesyntaxhighlight lang="bash">
adb shell stop
adb shell setprop log.redirect-stdio true
adb shell start # this may restart your Android session
</syntaxhighlight>
</source>
 
Para ver os arquivos de log, você pode usar:
Linha 126:
Você ativar o acompanhador das chamadas do JNI para o C/C++, assim:
 
<sourcesyntaxhighlight lang="bash">
adb shell stop
adb shell setprop dalvik.vm.checkjni true
adb shell start
</syntaxhighlight>
</source>
 
Você vai obter todos traços adicionais no log do sistema, e o JNI ficara mais restrito ao que ele pode aceitar.
Linha 141:
* Veja abaixo se você usa o Cyanogen 7.1 para corrigir o 'run-as'
* Usando o formato "stabs" para depurar os símbolos no Android.mk, senão o GDB pode mostrar as linhas de códigos errada <ref>http://groups.google.com/group/android-ndk/browse_thread/ebd969a055af3196</ref>:
<sourcesyntaxhighlight lang="make">
LOCAL_CXXFLAGS := -gstabs+
</syntaxhighlight>
</source>
 
GDB precisa da depuração do compilador, coloque um NDK_DEBUG=1 enquanto compila seu código C++:
<sourcesyntaxhighlight lang="bash">
ndk-build NDK_DEBUG=1
</syntaxhighlight>
</source>
 
Enquanto inicia o gdb, veja se seu AndroidManifest.xml menciona um depurador, se não o gdb se comportará mal (com falhas nas informações do thread, crash e etc...):
<sourcesyntaxhighlight lang="xml">
<application ...
android:hasCode="true" android:debuggable="true"
</syntaxhighlight>
</source>
 
O <code>gdb-server</code> precisa de alguns segundos para iniciar no seu dispositivo, assim que seu programa iniciar ele possa de ser pausado pelo depurador. você precisar colocar em sua função <code>android_main</code>:
<sourcesyntaxhighlight lang="cpp">
sleep(5);
</syntaxhighlight>
</source>
 
Para iniciar a sessão do depurador, digite:
Linha 186:
 
Para obter maiores informações você precisa criar um aplicativo Java bem simples para carregar as bibliotecas manualmente:
<sourcesyntaxhighlight lang="java">
package com.example.helloandroid;
 
Linha 199:
}
}
</syntaxhighlight>
</source>
 
Pode aparecer um este erro mais especifico, existe uma falha na implementação do STL:
Linha 212:
Isto pode acontecer caso quando o construtor do C++ de uma global estática quebrar enquanto chama a biblioteca, mesmo antes de sua aplicação ser iniciada.
Você precisa reproduzir um carregamento de uma biblioteca em C básico:
<sourcesyntaxhighlight lang="c">
#include <stdio.h>
#include <dlfcn.h>
Linha 239:
}
}
</syntaxhighlight>
</source>
 
Para manda-lo para o dispositivo execute isto:
<sourcesyntaxhighlight lang="bash">
$ arm-linux-androideabi-gcc test-dlsym.c
$ adb push a.out /
Linha 250:
Loading library: OK
Loading symbol: OK
</syntaxhighlight>
</source>
Você também pode usar o <code>strace</code> que é mais precisa:
<sourcesyntaxhighlight lang="bash">
# strace /a.out
</syntaxhighlight>
</source>
 
Lá não possui um <code>ldd</code> como padrão do Android, mas você pode simular ele usando:
<sourcesyntaxhighlight lang="bash">
arm-linux-androideabi-objdump -x libs/armeabi/libnative-activity.so | grep NEEDED
# ou
arm-linux-androideabi-readelf -d libs/armeabi/libnative-activity.so | grep NEEDED
</syntaxhighlight>
</source>
 
== Abstração das diferenças entre o OpenGL e o GLES2 ==
Linha 283:
 
Primeiro, prepare o compilador-cruzado pelo NDK:
<sourcesyntaxhighlight lang="bash">
/usr/src/android-ndk-r7c/build/tools/make-standalone-toolchain.sh --platform=android-9 \
--install-dir=/usr/src/ndk-standalone-9
PATH=/usr/src/ndk-standalone-9/bin:$PATH
</syntaxhighlight>
</source>
 
Em seguida use o compilado-cruzado para o freetype:
<sourcesyntaxhighlight lang="bash">
tar xf freetype-2.4.10.tar.bz2
cd freetype-2.4.10/
Linha 296:
make -j4
make install DESTDIR=$(pwd)
</syntaxhighlight>
</source>
(Você pode usar o --prefix=/usr/src/ndk-standalone-9/sysrot/usr como alternativa se você não planeja usar o compilador NDK do sistema.)
 
Linha 310:
 
Em seguida escreva no <code>Android.mk</code> a nova pasta do freetype:
<sourcesyntaxhighlight lang="make">
LOCAL_PATH:= $(call my-dir)
 
Linha 320:
 
include $(PREBUILT_STATIC_LIBRARY)
</syntaxhighlight>
</source>
 
See <code>docs/STANDALONE-TOOLCHAIN.html</code> and <code>docs/PREBUILTS.html</code> in the NDK for details.
The <code>CLEAR_VARS</code> bit is not documented, but is necessary to avoid mixed-up paths; it is used in the <code>native_app_glue</code> NDK module.
Para usar o FreeType em seus projetos edite o arquivo <code>Android.mk</code>:
<sourcesyntaxhighlight lang="make">
...
LOCAL_STATIC_LIBRARIES := ... freetype
...
$(call import-module,freetype)
</syntaxhighlight>
</source>
 
Para isto você especificara a pasta aonde o freetype esta, usando a variável <code>NDK_MODULE_PATH</code>.
Para instancia-lo, você precisa copiar o <code>freetype</code> na pasta do seu projeto e compilar usando o:
<sourcesyntaxhighlight lang="bash">
ndk-build NDK_MODULE_PATH=. ...
</syntaxhighlight>
</source>
 
Nosso empacotador já esta definido em <code>NDK_MODULE_PATH=$$NDK_MODULE_PATH:.</code>