Android

From Lazarus wiki
Revision as of 10:50, 14 February 2013 by Yurysidorov (talk | contribs) (FPC sources)

Android target

Currently support for the Android target is present in the trunk (development) version 2.7.1 of FPC.

Supported CPUs:

  • ARM
  • i386

Android NDK

You need to download and install Android NDK in order to compile programs for the android target. Download Android NDK using this link: http://developer.android.com/tools/sdk/ndk/index.html

Extract it to some folder.

FPC sources

Check out the latest trunk sources of FPC using the following command:

svn co http://svn.freepascal.org/svn/fpc/trunk FPC

Now you have the compiler sources in the FPC sub-folder.

Building cross compiler

You need to have working installation of FPC 2.6.x compiler in order to create the cross-compiler.

This tutorial describes how to build the ARM cross-compiler on Windows, but it can be used for any system with small obvious modifications.

Use the similar steps to build i368 cross-compiler.

Assume the following paths:

  • Android NDK path: C:\Program Files\Android SDK\android-ndk-r8d
  • FPC svn sources path: C:\Develop\FPC\FPC
  • The cross-compiler installation path: C:\Develop\FPC\pp

Add path to Android binutils to the PATH environment variable. In this tutorial the path is C:\Program Files\Android SDK\android-ndk-r8d\toolchains\arm-linux-androideabi-4.7\prebuilt\windows\bin

First you need to build the latest version of the fmcmake support program. To do that cd to the following folder: C:\Develop\FPC\FPC\utils\fpcm\fpcmake Then execute the command: make

Now cd to the root of FPC sources folder: C:\Develop\FPC\FPC

Execute the following command:

make clean crossall crossinstall OS_TARGET=android CPU_TARGET=arm CROSSOPT="-O2 -g-" INSTALL_PREFIX=C:\Develop\FPC\pp FPCMAKE=C:\Develop\FPC\FPC\utils\fpcm\fpcmake

After that you should have the cross-compiler and units installed in folder C:\Develop\FPC\pp

Now create a new fpc.cfg file in folder C:\Develop\FPC\pp\bin\i386-win32 and paste into it the following text:

-Fu/Develop/FPC/pp/units/$FPCTARGET/*

#ifdef android
#ifdef cpuarm
-FlC:\Program Files\Android SDK\android-ndk-r8d\platforms\android-14\arch-arm\usr\lib
#endif
#ifdef cpu386
-FlC:\Program Files\Android SDK\android-ndk-r8d\platforms\android-14\arch-x86\usr\lib
#endif
#endif

Compiling programs

Now, when the cross-compiler is ready, you can compile programs for the Android target:

C:\Develop\FPC\pp\bin\i386-win32\ppcrossarm -Tandroid testprog.pas

Developer notes

  • The compiler does NOT define LINUX during compilation! It defines UNIX and ANDROID though.

(Background: Android is not completely Linux compatible, e.g. a few syscalls and default library functions e.g. in pthreads, ... are missing, and it generally behaves different in a few ways. This makes the amount of defines manageable by avoiding if defined(linux) and not defined(android). Actually, the list of things that are different is only growing).

  • Shared libraries do not have argc/argv available (i.e. set to 0 or nil) because of Android.
  • The selection of compiled packages is mostly driven by what libraries are shipped by default on Android, i.e. not much.