C-Programm auf Android

H

htcdesiree

Neues Mitglied
0
Hallo,

Wie kann ich ein C Programm von meiner Linux Kiste auf das Android Handy bringen???
Ich habe jetzt schon zig Anleitungen durch angefanngen von agcc bis hin zum ndk... Nichts funktioniert.

Im Moment probier ich es mit folgendem Makefile:
# Dynamic hello example for Android NDK
# motz diary: Dynamically linked "Hello, world!" for Android

NDK = /usr/src/android-ndk-1.5_r1
NDK_ARCH = $(NDK)/build/platforms/android-1.5/arch-arm
NDK_COMP = $(NDK)/build/prebuilt/linux-x86/arm-eabi-4.2.1

ifneq ($(shell uname -m),armv6l)
# When not compiling on the phone use cross compiler
CROSS_COMPILE = /opt/android/ndk/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/arm-eabi-gcc
endif

CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld

# bionic setbuf() segfaults, do not use
CFLAGS += -D'setbuf(a,b)='
CFLAGS += -DUSE_FPM
CFLAGS += -I$(NDK_ARCH)/usr/include

%o: %c Makefile
$(CC) $(CFLAGS) -c $<

all: hello-gcc hello-ld

hello-gcc: hello.o fpm.o
strace -o bla.txt -s 512 -f $(CC) -o $@ \
-nostartfiles -nodefaultlibs -nostdlib \
-lc -lm -lgcc -L$(NDK_ARCH)/usr/lib \
-Wl,-rpath-link -Wl,$(NDK_ARCH)/usr/lib \
-Wl,--dynamic-linker -Wl,/system/bin/linker \
$(NDK_ARCH)/usr/lib/crtbegin_dynamic.o \
$^ \
$(NDK_ARCH)/usr/lib/crtend_android.o

hello-ld: hello.o fpm.o
$(LD) -o $@ \
-lc -lm -lgcc -L$(NDK_ARCH)/usr/lib \
-L$(NDK_COMP)/lib/gcc/arm-eabi/4.2.1 \
-rpath-link $(NDK_ARCH)/usr/lib \
--dynamic-linker /system/bin/linker \
$(NDK_ARCH)/usr/lib/crtbegin_dynamic.o \
$^ \
$(NDK_ARCH)/usr/lib/crtend_android.o

clean:
rm -f hello-ld hello-gcc
rm -f *.o
rm -f *~
Das Ergebnis ist dann:
/opt/android/ndk/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/arm-eabi-gcc gcc -D'setbuf(a,b)=' -DUSE_FPM -I/usr/src/android-ndk-1.5_r1/build/platforms/android-1.5/arch-arm/usr/include -c hello.c
arm-eabi-gcc: gcc: No such file or directory
In file included from hello.c:1:
/opt/android/ndk/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/../lib/gcc/arm-eabi/4.4.0/include-fixed/stdio.h:50:23: error: sys/cdefs.h: No such file or directory
/opt/android/ndk/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/../lib/gcc/arm-eabi/4.4.0/include-fixed/stdio.h:51:24: error: sys/_types.h: No such file or directory
In file included from hello.c:1:
/opt/android/ndk/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/../lib/gcc/arm-eabi/4.4.0/include-fixed/stdio.h:163: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'extern'
/opt/android/ndk/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/../lib/gcc/arm-eabi/4.4.0/include-fixed/stdio.h:232: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__BEGIN_DECLS'
/opt/android/ndk/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/../lib/gcc/arm-eabi/4.4.0/include-fixed/stdio.h:382: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__BEGIN_DECLS'
/opt/android/ndk/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/../lib/gcc/arm-eabi/4.4.0/include-fixed/stdio.h:393: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'static'
hello.c:2:18: error: time.h: No such file or directory
hello.c: In function 'main':
hello.c:10: error: 'time_t' undeclared (first use in this function)
hello.c:10: error: (Each undeclared identifier is reported only once
hello.c:10: error: for each function it appears in.)
hello.c:10: error: expected ';' before 't'
hello.c:14: error: 't' undeclared (first use in this function)
make: *** [hello.o] Fehler 1

EDIT:
root@raw:/opt/android/shellfiles# ./agcc -o main main.c
arm-eabi-gcc: /opt/android/ndk/toolchains/arm-eabi-4.4.0/out/target/product/generic/obj/lib/crtend_android.o: No such file or directory
arm-eabi-gcc: /opt/android/ndk/toolchains/arm-eabi-4.4.0/out/target/product/generic/obj/lib/crtbegin_dynamic.o: No such file or directory
arm-eabi-gcc: /opt/android/ndk/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a: No such file or directory
cc1: error: /opt/android/ndk/toolchains/arm-eabi-4.4.0/system/core/include/arch/linux-arm/AndroidConfig.h: No such file or directory
main.c: In function 'main':
main.c:4: warning: incompatible implicit declaration of built-in function 'printf'



Die Fehler bezüglich den fehlenden Libs etc. bekomme ich bei agcc auch.
Kann mir wer weiterhelfen? Ich find den Fehler nicht...
 
Zuletzt bearbeitet:
Es wird wohl irgendwie mit dem NDK funktionieren, aber habe ich auch nicht hinbekommen (bin ja eigentlich auch Linux Neuling)

Habe irgendwo einen Download für einen cross compiler gefunden mit dem es aber dann auch geradewegs funktioniert hat. Das schaut dann so aus:

Hello.c

#include <stdio.h>
int main(void)
{
printf("Hello, Droid\n");
return 0;
}

Make:

~/cross-compiler-armv6l/bin/armv6l-g++ --static hello.c -o hello


Habe den CC über mein Dropbox freigegeben (sind knapp über 20mb):

http://dl.dropbox.com/u/11516830/cross-compiler-armv6l.tar.bz2
 
  • Danke
Reaktionen: PJF16
Danke für die rasche Antwort!
Werd's gleich mal ausprobieren.
 
edit hat sich erledigt :)
link funktioniert - probier die sache jetzt gleic haus.
 
Hallo,

Kompilierungsvorgang funktioniert jetzt einwandfrei.
Wenn ich das Programm auf dem HTC mit ./programm starte bekomme ich leider "Permission Denied".
Hab zur Sicherheit chmod 777 gemacht - keine Änderung.
 
htcdesiree schrieb:
Hallo,

Kompilierungsvorgang funktioniert jetzt einwandfrei.
Wenn ich das Programm auf dem HTC mit ./programm starte bekomme ich leider "Permission Denied".
Hab zur Sicherheit chmod 777 gemacht - keine Änderung.

wohin hast du's denn kopiert?
Auf der SD Karte hast du meines Wissens nach z.B. keine Ausführ-Rechte

du kannst sonst einfach:

adb push program /data/local
adb shell
cd /data/local
chmod 744 program
./program
 
  • Danke
Reaktionen: htcdesiree
ramdroid schrieb:
wohin hast du's denn kopiert?
Auf der SD Karte hast du meines Wissens nach z.B. keine Ausführ-Rechte

du kannst sonst einfach:

Danke!
Verdammt ich hätte einfach die mount table anschauen sollen, dann hät ichs selber gesehen....

Funktioniert jetzt :)
*bitte nicht erschlagen für den fehler*
 
Edit:
Kann es sein dass popen() auf Android nicht funktioniert?
Habe eine Funktion wie:
void exec_syscall (string command)
{
cout << "var:" << command;
char buffer[50000];
FILE *stream;
stream = popen(command.c_str(),"r");
while (fgets(buffer, 50000, stream) != NULL )
{
cout<<buffer;
cout<<endl;
}
}
Bringt mir einfach kein Ergebnis! z.B. wird
oder
übergeben. Nichts. Ich bekomme:
aber popen() führt nichts aus...
habe auch schon versucht:
zu übergeben - selbes Ergebnis.

Weiß da wer bescheid?
 
Überprüfe mal ob stream == NULL und gib dann die errno aus.
Außerdem würde ich nicht so viel Stack verbraten.
Das geht auch in kleineren Häppchen.
 
Hey,
Also hab mal mit NULL abgefragt

Code:
void exec(string cmd)
{
        cout << "GET VALUE: " << cmd << endl;
  char buffer[BUFFER_SIZE];
  FILE *stream;

  stream = popen(cmd.c_str(), "r");
if (stream == NULL)
        cout << "Stream is NULL" <<endl;

  while ( fgets(buffer, BUFFER_SIZE, stream) != NULL )
        cout << buffer <<endl;

  pclose(stream);
}
Aber stream scheint nicht NULL zu sein, falle da mal nicht in die IF-Condition rein.

Des weiteren scheinen Codestücke wie
Code:
system("id > /data/local/test");
Auch nicht zu funktionieren....

Weiß da wer Bescheid?
 
Zuletzt bearbeitet:
EDIT:

Ich hab die errno vergessen, ich bekomme:
error: No such file or directory
Eingaben sind folgende:
bzw.
Er scheint die Datei nicht zu finden, obwohl die Pfade doch passen?
Überseh ich hier was?

EDIT:
und ich hab mal folgenden Code dazu gelegt:
Code:
char * pPath;   
pPath = getenv ("PATH");   
if (pPath!=NULL)     
printf ("The current path is: %s",pPath);
und bekomme:
The current path is: /sbin:/system/sbin:/system/bin:/system/xbin
RE-EDIT:
und wenn ich über getcwd() den aktuellen Pfad suche, bekomme ich:
Das aktuelle Verzeichnis ist : /data/local

Hoffe jemand kann helfen...

Danke...
 
Zuletzt bearbeitet:
Push
 
kann wirklich niemand helfen?
 
Falls stream != NULL ist wird die errno schon vorher gesetzt.

Geht in dem Programmverzeichnis "sh -c ls" ?
Geht es als root ?

Sonst liegt es wohl an der toolchain.
Schon mal das ndk standalone test Programm probiert ?
Falls das geht einfach dein source code reinkopieren.
 
android-ndk-r5b/tests/run-standalone-tests.sh
android-ndk-r5b/tests/standalone/test-basic-c++/test_basic_exceptions.cpp
 
Falls noch jemand Probleme hat... ooookay.... die toolchain von mir war wirklich Müll... sorry für die Verwirrung :winki:

Hatte eben selbst Probleme mit einem Projekt das mir unfähig war den Inhalt eines bestimmten Verzeichnisses auszugeben.

Habe also das run-standalone-tests.sh für mein Projekt angepasst und damit gebaut --> funktioniert :D
 

Ähnliche Themen

C
Antworten
0
Aufrufe
1.210
Cortablo
C
Slinthorax
  • Slinthorax
Antworten
5
Aufrufe
1.818
Kosake77
Kosake77
O
Antworten
10
Aufrufe
2.738
BOotnoOB
BOotnoOB
Zurück
Oben Unten