Android

From Lazarus wiki
Revision as of 21:50, 13 February 2013 by Yurysidorov (talk | contribs) (Undo revision 65889 by Yurysidorov (talk))
Jump to navigationJump to search

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 FPC http://svn.freepascal.org/svn/fpc/trunk

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 all install OS_TARGET=android CPU_TARGET=arm CROSSOPT="-O2 -g-" CROSSINSTALL=1 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
#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.