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.
![]() |
|
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













24 de maio de 2009 às 18h48
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?
8 de junho de 2009 às 10h59
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?
8 de junho de 2009 às 11h01
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.
11 de junho de 2009 às 10h28
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
17 de junho de 2009 às 8h48
Grande. trabalhos como um encanto.
@Dorian: obrigado pela correção.
2 de setembro de 2009 às 10h15
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 ?
15 de outubro de 2009 às 23h58
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.
16 de outubro de 2009 às 20h50
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.”
27 de outubro de 2009 às 2h24
[...] 關資料: Link1、Link2、Link3 [...]
14 de dezembro de 2009 às 10h38
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á.
14 de dezembro de 2009 às 23h51
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
15 de dezembro de 2009 às 5h34
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.
19 de fevereiro de 2010 às 21h12
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
20 de fevereiro de 2010 à 1h20
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.
16 de março de 2010 às 9h49
Eu gosto da idéia, fresca!
30 de março de 2010 às 0h38
Explicação muito bonita! você poupou o meu tempo. Todos em uma solução de lugar! Agradecimentos! All in one place solution! Thanks!
30 de março de 2010 às 11h53
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.
31 de março de 2010 às 17h36
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?
20 de abril de 2010 às 14h28
Obrigado por levar um tempo para fornecer esta informação
é o mais útil
20 de abril de 2010 às 15h10
Você é bem-vindo, a.
21 de abril de 2010 às 22h52
Você pode escrever que a mesma escrita agcc de mips baseou o sistema?
21 de abril de 2010 às 22h54
Posso perguntar, que hardware de andróide MIPS você tem?
21 de abril de 2010 às 22h56
Tenho conselho de Malta MIPS com MIPSr2
21 de abril de 2010 às 23h14
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
Maio 2o, 2010 às 15h12
Pode, o t instalar pacotes adicionais do andróide em ubuntu 10.4
17 de maio de 2010 às 23h16
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?>. < >.<
19 de maio de 2010 às 11h19
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:
Relocations in generic ELF (EM: 
Relocations in generic ELF (EM: 
/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:
/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.
19 de maio de 2010 às 11h20
/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
20 de maio de 2010 às 14h34
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
21 de maio de 2010 às 0h49
Compilei um test.c para e corri na concha de adb mas como correr pelo meu telefone de andróide? (DSTL1)
21 de maio de 2010 às 23h03
olá, por favor faça, penso que isto ajudará a comunidade.
21 de maio de 2010 às 23h04
mavci, você pode usar a aplicação terminal para o andróide.
21 de maio de 2010 às 23h30
agradecimentos Radu!
Escreverei todo o explainations amanhã.
23 de maio de 2010 às 14h36
Okay, então posso acrescentá-los a este correio, portanto os outros podem usá-lo também.
26 de maio de 2010 às 23h17
isto é assim droga. Posso compilar todas as espécies de programas de consolo agora!
Janota, você balança-se!
26 de maio de 2010 às 23h19
@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
28 de maio de 2010 às 8h47
contente você gosta dele, Quincy.
8 de junho de 2010 às 22h43
Não pode parecer conseguir que o gpg - seção de importação trabalhe. Como exatamente você cola a chave em?
15 de junho de 2010 às 14h19
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
O primeiro de julho de 2010 às 23h50
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 ++
2 de julho de 2010 às 10h28
Olá Anup, Obrigado pela sua contribuição!
7 de julho de 2010 às 21h35
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.
28 de julho de 2010 às 22h51
[...] o Andróide C desenvolvimento nativo – toma o controle completo! [...]
29 de agosto de 2010 às 21h22
Ver este seminário NDK/JNI também:
http://www.pock etmagic.net/? p=1332