PocketMagic

PocketMagic

Onde Tecnologia encontra magia

PocketMagic RSS Alimentos
 

O Andróide C desenvolvimento nativo – toma o controle completo!

Por Radu Motisan Posto no correio no dia 12 de maio de 2009

Um projeto recente tenho continuado a trabalhar Bluetooth necessitado que programa no Andróide.
Tendo uma olhada rápida por cima do 1.5 último Andróide SDK, posso ver que o suporte de bluetooth falhava. A pesquisa posterior indicou que Google expressivamente excluiu Bluetooth APIs culpando a falta do tempo.

De outro lado, não sou um grande torcedor de Java, para dizer o menor. Acho o Java pouco amável, e eu não gosto da olhada e a sensação do Java apps. Desculpe, prefiro C/C ++ desde que fornece o melhor controle e a flexibilidade. Portanto é tempo de começar a fazer C/C ++ aplicações nativas do Andróide Google. Sorry, I prefer C/C++ since it provides better control and flexibility. So it's time to start doing C/C++ native applications for the Google Android.

Como dirigido um programa C em Andróide Google?
Primeira coisa que mostrarei aqui, deve compilar um programa C simples do Andróide.


#include <stdio.h>
int main()
{
printf("Hello Google Android world!\nwww.pocketmagic.net\n");
return 1;
}

Salve este programa como test.c. Nos seguintes passos estaremos compilando esta amostra do Andróide Google usando gcc.

Os instrumentos

1. Carregue de ubuntu linux. Atualmente uso a edição 9.04 de Mesa em uma máquina virtual.
Atenção: Você precisará de instalar Ubuntu em uma máquina com o Carneiro de PELO MENOS 1.5 GB, 10 GB ext2 partição e partição de Troca de 2 GB ou você não será capaz de usar a informação deste seminário (menos então as exigências mínimas resultarão na impossibilidade de compilar o Código de Andróide e precisamos disto para as bibliotecas).

2. Uma vez que Ubuntu é instalado, carregue do Texto fonte de Andróide. Na sua caixa linux instalam pacotes adicionais:
$ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
$ sudo apt-get install valgrind

Este é só para usuários Intrépidos Ubuntu:

$ sudo apt-get install lib32readline5-dev

3. Instale Repo
Crie um ~ / diretório de caixa no seu diretório padrão, e cheque para estar seguro que este diretório de caixa está no seu caminho:

$ cd ~
$ mkdir bin
$ echo $PATH

Para acrescentá-lo ao Caminho, você pode usar:

$ PATH=$PATH:~/bin/

Carregue da escrita repo e assegure-se que é executável:

$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo

4. Inicialização de um cliente Repo
Crie um diretório vazio para manter os seus arquivos de trabalho:

$ mkdir mydroid
$ cd mydroid

Repo dirigido init para abaixar a última versão de Repo com todos os seus embaraços de defeito mais recentes. Você deve especificar um URL do manifesto:

$ repo init -u git://android.git.kernel.org/platform/manifest.git
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake

Quando incitado, configure Repo com o seu verdadeiro nome e endereço de e-mail. Se você planejar submeter o código, use um endereço de e-mail que se associa com uma conta de Google.
Uma inicialização bem sucedida terminará em uma mensagem tal como

repo initialized in /mydroid

O seu diretório de cliente deve conter agora um diretório.repo onde os arquivos, tais como o manifesto serão guardados.

5. Obtenção dos arquivos
Para derrubar arquivos ao seu diretório de trabalho dos repositórios como especificado no manifesto à revelia, correr

$ repo sync

Para mais sobre a sincronização de repo e outras ordens de Repo, ver a Utilização Repo e Git.
Os arquivos originais de Andróide serão localizados no seu diretório de trabalho abaixo dos seus nomes do projeto.

6. Verifying Git Tags
Carregue a seguinte chave pública no seu banco de dados-chave GnuPG. A chave é usada para assinar etiquetas anotadas que representam lançamentos.

$ gpg --import

então cole a chave (s) abaixo, e Controle-D de prensa para terminar a entrada e processar as chaves.

key 9AB10E78: "The Android Open Source Project <initial-contribution@android.com>"
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.2.2 (GNU/Linux)

mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV
lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7
8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD
u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z
wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq
/HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5
jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4
MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9
b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv
aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k
cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX
gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI
2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl
QN4mWRhfzDOk/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up
hisyEmmHv6U8gUb/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk
C2b1TvVk9PryzmE4BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX
LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5 +
OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M
pK+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s
KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phb
N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA
vUXRwm/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo
G1S8fXgE0Lq3cdDM/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ
hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0l
EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM =
=Wi5D
-----TERMINE O BLOCO DE CHAVE PÚBLICA PGP-----

Depois de importar as chaves, você pode verificar qualquer etiqueta com

$ git tag -v tagname

7. Criação do código
O código de Andróide contém um defeito que não foi resolvido até a data deste artigo.
Assim antes que você comece a compilar o código, você precisará de algumas modificações, ou construir falhará (depois consumir um pouco do seu tempo e paciência). O erro é:

external/qemu/sockets.c: In function 'sock_address_init_resolve':
external/qemu/sockets.c:637: error: 'EAI_NODATA' undeclared (first use
in this function)
external/qemu/sockets.c:637: error: (Each undeclared identifier is
reported only once
external/qemu/sockets.c:637: error: for each function it appears in.)
make: *** [out/host/linux-x86/obj/EXECUTABLES/emulator_intermediates/
sockets.o] Error 1

Fixar isto, antes de compilar o código de andróide, ~ aberto/mydroid/external/qemu/sockets.c e acrescentar

#define __USE_GNU

justo antes o #include <netdb.h>

Agora você pode construir os arquivos. Dirigido fazem de dentro do seu diretório de trabalho:

$ cd ~/mydroid
$ make

Na minha máquina virtual que corre ubuntu, o processo de montagem tomou várias horas. O PC de anfitrião é um 2.6GHz P4.

Compile test.c com gcc da plataforma de Andróide
O andróide usa uma versão simplificada de libc, chamado biônico. Temos de compilar o compilador preconstruído de Andróide de utilização arm-eabi-gcc, e usar a biblioteca biônica pelo telefone.
O modo fácil de fazer isto deve usar o agcc perl empacotador. Você pode carregar do arquivo original aqui, e modificar

my $TOOLCHAIN = "$DROID/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1";

a

my $TOOLCHAIN = "$DROID/prebuilt/linux-x86/toolchain/arm-eabi-4.3.1";

Ou carregue desta versão atualizada diretamente.

Copie agcc ao seu diretório padrão, e chmod ele:

chmod +x agcc

então estabeleça o CAMINHO para o libs biônico e a posição agcc:

$ PATH=$PATH:~/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/bin:~/:~/mydroid/

Agora você pode compilar o arquivo test.c:

agcc test.c -o test

Tome o binário de experiência resultante e transfira dele para a sua utilização de andróide:

adb push test /data/local/test

Então corrida ele:

adb shell
chmod 775 test
./test

Ver as fotos de mais detalhes:

A seguinte coisa a fazer é tentar controlar a funcionalidade bluetooth usando código de natural C e o andróide toolchain.

Mais no natural C apps para Andróide aqui.

A parte deste artigo contém a informação apresentada por Google em http://sourc e.android.com/download

As melhores considerações,
Radu Motisan

Por Radu Motisan

44 Respostas “Ao andróide C desenvolvimento nativo – tomam o controle completo!

  1. 1
    Anders:

    Grande. Obrigado pelas instruções.
    Qualquer idéia como a partida o seu programa C quando as botas de sistema, ou depois que ele inicializa?

  2. 2
    Ash09:

    Oi
    quando dirijo o seguinte no meu Ubuntu 9.04:
    Os $ sudo apto - vêm instalam lib32readline5-dev
    Estou adquirindo o seguinte erro:
    E: Não pode encontrar o pacote lib32readline5-dev
    como fez a resolução de u isto?

  3. 3
    Radu Motisan:

    Isto é só para usuários intrépidos ubuntu.

    Você não precisará dele em 9.04 desktop.

    Modifiquei o correio para refletir isto também.

  4. 4
    Dorian:

    Oi,

    Obrigado pelas instruções.
    Somente um pouco de modificação, você tem de modificar agcc, como o toolchain não é libgcc.a correto não está mais na pasta de intertrabalho, portanto 2 linhas têm de ser modificadas também.

    "$TOOLCHAIN/lib/gcc/arm-eabi/4,3,1/libgcc.a", em linha 117 e 132
    Agradecimentos

  5. 5
    Stephan:

    Grande. trabalhos como um encanto.
    @Dorian: obrigado pela correção.

  6. 6
    Anupam:

    Oi,
    Tenho o ambiente para construir um código de C do andróide 1.0 na máquina ubuntu. Agora carreguei do Andróide 1.5 SDK de linux e quero compilar o mesmo código de C do Andróide 1.5. O que se modifica tenho de fazer? What changes I have to make ?

  7. 7
    marius:

    Oi,
    Estou usando o andróide X86 (tomado no dia 10 de outubro ‘09).
    Venho: adb: não encontrado not found

    Então. Montei o system.img resultado, copiado explícito o *hello em
    /system/bin e dados/, então tenho constroem o iso e inicializam-no.
    Posso ver o meu olá, mas.

    #. / olá
    bom dia: não encontrado

    #hello
    bom dia: não encontrado

    #adb
    adb não encontrado

    A concha é muda ou.

  8. 8
    Radu Motisan:

    oi marius,
    que produção fazem você vem de ls-l
    ?
    também, o que faz você quer dizer “então tenho constroem o iso e inicializam-no.

  9. 9
    Construir o ambiente para desenvolver o Andróide de freerunner | allenc.tw:

    [...] 關資料: Link1、Link2、Link3 [...]

  10. 10
    Perumal:

    Fiz exatamente o mesmo como mencionado aqui mas continuo adquirindo o seguinte erro:

    “/mydroid/out/target/product/generic/obj/lib/crtbegin_dynamic.o: Em função `_start’:
    bionic/libc/arch-arm/bionic/crtbegin_dynamic. S: (. text+0×14): referência indefinida para `principal'(.text+0×14): undefined reference to `main’
    collect2: o ld devolveu 1 posição de saída”

    Alguma idéia como resolvê-lo?

    Obrigado desde já.

  11. 11
    Radu Motisan:

    Assegure-se que você pôs o seguinte arquivo no caminho:

    $DROID/prebuilt/linux-x86/toolchain/arm-eabi-4,2,1

    $DROID/prebuilt/linux-x86/toolchain/arm-eabi-4,3,1

  12. 12
    Perumal:

    Ambo o arquivo está no caminho mas ainda estou adquirindo o mesmo erro. Ele trabalhava bem poucos meses atrás mas agora quando tentei novamente estou adquirindo o acima mencionado erro.

  13. 13
    Tayefeh:

    Eh, isto é realmente grande! Somente verificado ele e ele trabalharam … agora posso transportar todos os meus programas C antigos em diagonal ao andróide lol

  14. 14
    Radu Motisan:

    Eh lá Tayefeh, engraçado para ver isto não é ele?
    A verdade é você pode fazer apps muito potente dolorido utilização do JNI.
    Implementei um bluetooth completo l2cap interface do Java usando-o. Porá no correio mais logo.

  15. 15
    mbt:

    Eu gosto da idéia, fresca!

  16. 16
    prado:

    Explicação muito bonita! você poupou o meu tempo. Todos em uma solução de lugar! Agradecimentos! All in one place solution! Thanks!

  17. 17
    Radu Motisan:

    Sou contente que você gosta dele. Assegure-se que você lê sobre JNI também: ele fornece mais algumas opções. it provides some more options.

  18. 18
    prado:

    Uma mais coisa – estou tentando dirigir uma amostra ‘olá’ programa mundial usando um arquivo.cpp em vez do arquivo.c. O compilador queixa-se de não encontrar iostream.h. Você pode dizer-me como usar a sua escrita para chamar um c ++ arquivo? Could you tell me how to use your script to call a c++ file?

  19. 19
    a:

    Obrigado por levar um tempo para fornecer esta informação;-) é o mais útil

  20. 20
    Radu Motisan:

    Você é bem-vindo, a.

  21. 21
    Kaushik:

    Você pode escrever que a mesma escrita agcc de mips baseou o sistema?

  22. 22
    Radu Motisan:

    Posso perguntar, que hardware de andróide MIPS você tem?

  23. 23
    Kaushik:

    Tenho conselho de Malta MIPS com MIPSr2

  24. 24
    Kaushik:

    Já tenho o andróide que corre nele mas o meu 3o software partidário que é geralmente usado no ambiente glic não trabalhará abaixo do andróide fundado biônico. Portanto eu me admirava pode nós fazer tal empacotador de sistemas baseados de mips.

    -Kaushik

  25. 25
    sabin:

    Pode, o t instalar pacotes adicionais do andróide em ubuntu 10.4

  26. 26
    Tanis:

    Oi Radu! Guia bonito, mas tenho um problema com o compilador agcc:

    ~ $ agcc helloword.c-o helloword
    arm-eabi-gcc:/home/tanisdlj/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a: Nenhum tal arquivo ou diretório No such file or directory

    Isto é o meu CAMINHO:

    tanisdlj@tanisdlj-and ev:~ $ ecoam $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/tanisdlj/bin/:/home/tanisdlj/mydroid/prebuilt/li nux-x86/toolchain/arm-eabi-4.3.1/bin:/home/tanisdlj/:/home/tanisdlj/mydroid/

    Sigo o seu guia passo a passo, mas tenho este problema. Alguma sugestão?>. < >.<

  27. 27
    Suhas:

    Oi Radu

    Segui todos os passos e no passo final
    agcc hello.c-o olá adquiro este erro

    /localhome/user/bin/mipsandroid/prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/bin/../lib/gcc/arm-eabi/4.3.1/../../../../arm-eabi/bin/ld:/localhome/user/bin/mipsandroid/out/target/product/generic/obj/lib/crtbegin_dynamic.o: Relocações em ELFO genérico (EM: 8) Relocations in generic ELF (EM: 8)
    /localhome/user/bin/mipsandroid/prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/bin/../lib/gcc/arm-eabi/4.3.1/../../../../arm-eabi/bin/ld:/localhome/user/bin/mipsandroid/out/target/product/generic/obj/lib/crtbegin_dynamic.o: Relocações em ELFO genérico (EM: 8) Relocations in generic ELF (EM: 8)
    /localhome/user/bin/mipsandroid/out/target/product/generic/obj/lib/crtbegin_dynamic.o: não pode ler símbolos: Arquivo em formato incorreto
    collect2: o ld devolveu 1 posição de saída

    Estabeleci o CAMINHO demasiado corretamente. Amavelmente por favor ajude-me.

  28. 28
    Suhas:

    /localhome/user/bin/mipsandroid/prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/bin/../lib/gcc/arm-eabi/4.3.1/../../../../arm-eabi/bin/ld:/localhome/user/bin/mipsandroid/out/target/product/generic/obj/lib/crtbegin_dynamic.o: Relocações em ELFO genérico (EM: 8) Relocations in generic ELF (EM: 8 )
    /localhome/user/bin/mipsandroid/prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/bin/../lib/gcc/arm-eabi/4.3.1/../../../../arm-eabi/bin/ld:/localhome/user/bin/mipsandroid/out/target/product/generic/obj/lib/crtbegin_dynamic.o: Relocações em ELFO genérico (EM: 8) Relocations in generic ELF (EM: 8 )
    /localhome/user/bin/mipsandroid/out/target/product/generic/obj/lib/crtbegin_dynamic.o: não pode ler símbolos: Arquivo em formato incorreto
    collect2: o ld devolveu 1 posição de saída

  29. 29
    mavci:

    sabin
    Instalei em ubuntu 10.04 e agora posso compilar arquivos c da rosquinha de massa frita de andróide 1.6
    se você quiser posso explicar

  30. 30
    mavci:

    Compilei um test.c para e corri na concha de adb mas como correr pelo meu telefone de andróide? (DSTL1)

  31. 31
    Radu Motisan:

    olá, por favor faça, penso que isto ajudará a comunidade.

  32. 32
    Radu Motisan:

    mavci, você pode usar a aplicação terminal para o andróide.

  33. 33
    mavci:

    agradecimentos Radu!
    Escreverei todo o explainations amanhã.

  34. 34
    Radu Motisan:

    Okay, então posso acrescentá-los a este correio, portanto os outros podem usá-lo também.

  35. 35
    quincy:

    isto é assim droga. Posso compilar todas as espécies de programas de consolo agora!

    Janota, você balança-se!

  36. 36
    quincy:

    @Tanis: você confundido as suas versões EABI no seu CAMINHO; há referências para 4.2.1 e 4.3.1 there are references to 4.2.1 and 4.3.1

  37. 37
    Radu Motisan:

    contente você gosta dele, Quincy.

  38. 38
    Chris:

    Não pode parecer conseguir que o gpg - seção de importação trabalhe. Como exatamente você cola a chave em?

  39. 39
    qds:

    Este seminário é fresco, mas tenho problemas quando tento compilar estático

    quando acrescento - diretiva estática adquiro o erro: “não pode encontrar-lc” “collect2: o ld devolveu 1 posição de saída” ld returned 1 exit status”

    você sabe como resolver este problema? Agradecimentos

    considerações

  40. 40
    Anup:

    Gcc 4.3 é necessitado para construir o andróide. 4.4 tem estrito tem regras mais estritas portanto ele vai por fprintf declaraion erros..

    Fixar,

    Os $ sudo apto - vêm instalam gcc-4.3 g ++-4.3
    $ sudo rm/usr/bin gcc
    $ sudo rm/usr/bin g ++
    $ sudo ln-s gcc-4.3 gcc
    $ sudo ln-s g ++-4.3 g ++

  41. 41
    Radu Motisan:

    Olá Anup, Obrigado pela sua contribuição!

  42. 42
    Telefone de andróide:

    Não sou de modo nenhum uma pessoa técnica, assim quando ele vem à compreensão de código, isto sente-se alheio a mim. Contudo, do que li, você encontrou um modo de incluir a funcionalidade de bluetooth com C ++? Isto é de fato gentil de fresco na minha opinião. Se você não tiver bluetooth, você fá-lo você mesmo. That’s actually kind of cool in my opinion. If you don’t have bluetooth, you make it yourself.

  43. 43
    a malandragem de andróide explora para a raiz:

    [...] o Andróide C desenvolvimento nativo – toma o controle completo! [...]

  44. 44
    Radu Motisan:

    Ver este seminário NDK/JNI também:

    http://www.pock etmagic.net/? p=1332

Deixe uma Resposta

Por favor copie a cadeia eNZ5UN ao campo abaixo:

Opções de Blog

Tradutor

English flagFrench flagGerman flagItalian flagPortuguese flagRussian flagSpanish flag
By N2H

Categorias

Arquivos

Etiquetas

Links patrocinados

Assine!

Adquira mais seguidores

Os nossos Patrocinadores