Tips and Tricks for Android Users
Compiling C Code for Android Using OS X
I wanted to try out compiling some native C code for use on my device, but I wanted to do it using my OS X machine. I found this post about using the prebuilt toolchain over at Android Tricks, but figured I would write up some additional details for those who might also be looking.
- Follow the instructions to download and build Android from source. Follow the whole thing (I had to create a case-sensitive disk image and all), including the actual build step. Otherwise you won’t have the libraries necessary and agcc will error out when you try to run it.
- Add the prebuilt/darwin-x86/toolchain/arm-eabi-4.2.1/bin subdirectory of where ever you built the source to your PATH, add it to your .bash_profile if you want.
- Download the agcc wrapper script, put it somewhere in your path, and make it executable.
Now you should be ready to compile a program and download it to your phone. This was my test app:
#include <stdio.h>
int main( int argc, char **argv ) {
printf("Hello from Droid Hacks!\n");
return 0;
}
And you should be able to compile it with “agcc hello.c -o hello” and end up with a hello executable:
~ > agcc hello.c -o hello ~ > file hello hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped ~ >
And you can move the file across to the phone and run it. You’ll have to make a directory to push it into. The sdcard is marked as noexec, so you can’t run stuff from there. And the data directory has more restrictive permissions. So you’ll have to su and create a directory on the data partition, and relax the perms on that directory:
~ > adb shell $ su # mkdir /data/droidtest # chmod 777 /data/droidtest # exit $ exit ~ > adb push hello /data/droidtest 418 KB/s (6747 bytes in 0.015s) ~ > adb shell $ cd /data/droidtest $ ls -l -rwxrwxrwx shell shell 6747 2009-05-27 08:56 hello $ ./hello Hello from Droid Hacks! $
And of course you can run the same thing from the terminal on your device as well:
| Print article | This entry was posted by Lead Hacker on May 27, 2009 at 9:40 am, and is filed under Tips. Follow any responses to this post through RSS 2.0. You can leave a response or trackback from your own site. |
about 2 years ago
Hi,
I did the same procedure in my Ubuntu PC. But agcc generate error
/android-ndk-1.5_r1/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/include/stdio.h:160: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘extern’
/android-ndk-1.5_r1/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/include/stdio.h:229: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__BEGIN_DECLS’
/android-ndk-1.5_r1/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/include/stdio.h:377: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__BEGIN_DECLS’
/android-ndk-1.5_r1/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/include/stdio.h:388: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘static’
Do you know this problem?
about 2 years ago
I’ve solved the problem.
It’s because agcc could not find the lib at which specified by:
my $ALIB = “$DROID/out/target/product/generic/obj/lib”;
So I put Android NDK together with Android source with small change in agcc so that it can find the lib, include and SHARED_LIBRARIES correctly.
Regards,