Sign in Join
Wiki copytemporary

Android/pl

English · Español · Français · Polski · Русский

Wszystkie artykuły dotyczące Androida są wymienione w Portal:Android.

(Android only)

Cel na Androida

Wsparcie dla docelowego systemu Android jest dostępne od FPC 3.0.

Obsługiwane procesory:

Android NDK

Musisz pobrać i zainstalować Android NDK, aby uzyskać binarne narzędzia krzyżowe, które kompilują programy dla systemu Android na Twoim obecnym komputerze.

Pobierz Android NDK, korzystając z tego linku: https://developer.android.com/ndk/downloads/index.html

Wypakuj go do jakiegoś folderu.

Pobierz FPC dla Androida

Wersja wydania

Jeśli programujesz dla systemu Android na komputerze z systemem Windows, możesz pobrać pakiet instalacyjny, który zawiera kompilatory skrośne dla systemu Android (ARM, i386, MIPS). Po zainstalowaniu cross-kompilatorów możesz budować binaria dla Androida bez żadnych dodatkowych czynności.

W przypadku innych platform hosta musisz pobrać archiwum źródeł FPC i zbudować kompilator skrośny, jak opisano poniżej.

Pobierz najnowsze wersje cross-kompilatorów i źródła FPC tutaj: http://freepascal.org/download.html

Wersja rozwojowa/deweloperska

Wersja rozwojowa (trunk) FPC może zawierać nowe funkcje lub poprawki błędów w porównaniu z najnowszą wydaną wersją.

Sprawdź najnowsze źródła trunk FPC za pomocą następującego polecenia:

text
svn co http://svn.freepascal.org/svn/fpc/trunk fpcsrc

Teraz masz najnowsze źródła kompilatora w podfolderze fpcsrc.

Budowanie kompilatora skrośnego

Aby utworzyć kompilator skrośny, musisz mieć działającą instalację najnowszej wersji FPC dla swojej platformy hosta.

W tym samouczku opisano, jak zbudować kompilator skrośny docelowo dla**arm-android** w systemie Windows. Ale samouczek można zastosować do dowolnego systemu z niewielkimi oczywistymi modyfikacjami.

Use the similar approach to build a aarch64-android or i386-android or x86_64-android or mipsel-android cross-compiler.

Użyj podobnego podejścia, aby zbudować kompilator skrośny aarch64-android, i386-android, x86_64-android lub mipsel-android.

Załóżmy, że mamy następujące ścieżki:

Dodaj ścieżkę do binutils systemu Android, do zmiennej środowiskowej PATH. W tym samouczku ta ścieżka to: C:\Program Files\Android SDK\android-ndk-r12b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows\bin

Otwórz wiersz poleceń i przejdź do katalogu głównego folderu źródeł FPC: cd C:\Develop\FPC\fpcsrc

Wykonaj następujące polecenie:

text
make clean crossall crossinstall OS_TARGET=android CPU_TARGET=arm INSTALL_PREFIX=C:\Develop\FPC\pp

Następnie powinieneś mieć zainstalowany kompilator skrośny i moduły w folderze C:\Develop\FPC\pp. Domyślnie wszystkie moduły są zbudowane z przełącznikiem optymalizacji -O2. Również programowa emulacja FPU jest używana domyślnie dla procesora ARM. Jeśli musisz określić różne opcje kompilatora do kompilacji, użyj parametru CROSSOPT. Na przykład, jeśli chcesz zbudować moduł ze sprzętową obsługą FPU i procesorem ARMv7a, użyj następującego polecenia:

text
make clean crossall crossinstall OS_TARGET=android CPU_TARGET=arm CROSSOPT="-Cparmv7a -Cfvfpv3" INSTALL_PREFIX=C:\Develop\FPC\pp

Teraz utwórz nowy plik fpc.cfg w folderze C:\Develop\FPC\pp\bin\i386-win32 i wklej do niego następujący tekst:

pascal
-FuC:\Develop\FPC\pp\units\$FPCTARGET*
pascal
#ifdef android
#ifdef cpuarm
-FlC:\Program Files\Android SDK\android-ndk-r12b\platforms\android-21\arch-arm\usr\lib
#endif
#ifdef cpuaarch64
-FlC:\Program Files\Android SDK\android-ndk-r12b\platforms\android-21\arch-arm64\usr\lib
#endif
#ifdef cpui386
-FlC:\Program Files\Android SDK\android-ndk-r12b\platforms\android-21\arch-x86\usr\lib
#endif
#ifdef cpux86_64
-FlC:\Program Files\Android SDK\android-ndk-r12b\platforms\android-21\arch-x86_64\usr\lib
#endif
#ifdef cpumips32
-FlC:\Program Files\Android SDK\android-ndk-r12b\platforms\android-21\arch-mips\usr\lib
#endif
#endif

Compiling programs

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

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

Notes

Known issues

Freeze during shared library initialization on Android prior 4.1

If your shared library contains a unit which performs dynamic loading of other shared libraries using LoadLibaray() or dlopen(), your library may fail to load on Android 4.0 or earlier. The library loading will freeze in such case. One of the units, which can trigger the issue is cwstring.

Due to a bug in Android versions prior to 4.1, the dlopen() API function does not support recursive calls. When a shared library is being loaded by JVM, using dlopen(), the library initialization is executed, including initialization code of all units in the library. If a unit initialization code calls dlopen() - it simply hangs, since the initial dlopen() is not finished yet and recursion is not allowed.

This issue is fixed in FPC 3.2.0: To workaround this issue the compiler uses the following trick: If a library exports JNI_OnLoad(), then no unit initialization is performed during library load. The initialization is called when JVM has loaded the library and then calls JNI_OnLoad().

Therefore, if you are creating a JNI shared library, always export JNI_OnLoad, even if it is empty.

Also you can trigger this bug if you have a JNI shared library, which use other shared library, created using FPC. The loading of this second library may hang. To workaround this, you need to export an empty JNI_OnLoad() function in the second library. Then you need to call JNI_OnLoad() from the initialization of the first library.

See also

External links


From the Free Pascal wiki, page "Android/pl", as it stood on 2021-11-03 after a change by Slawek, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 4, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.