Sign in Join
Wiki copytemporary

Android/pl: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Wszystkie artykuły dotyczące Androida są wymienione w [[Portal:Android]].
22
33*(Android only)*
44
55## Cel na Androida
66
77Wsparcie dla docelowego systemu Android jest dostępne od FPC 3.0.
88
99Obsługiwane procesory:
1010
1111- ARM (`CPU_TARGET=arm`)
1212- x86 (`CPU_TARGET=i386`)
1313- MIPS (`CPU_TARGET=mipsel`)
1414- ARM64 (`CPU_TARGET=aaarch64`) - w FPC 3.2+
1515- x86-64 (`CPU_TARGET=x86_64`) - w FPC 3.2+
1616- [[FPC JVM|JVM]] (nie omówione na tej stronie)
1717
1818## Android NDK
1919
2020Musisz pobrać i zainstalować Android NDK, aby uzyskać binarne narzędzia krzyżowe, które kompilują programy dla systemu Android na Twoim obecnym komputerze.
2121
2222Pobierz Android NDK, korzystając z tego linku: <https://developer.android.com/ndk/downloads/index.html>
2323
2424Wypakuj go do jakiegoś folderu.
2525
2626## Pobierz FPC dla Androida
2727
2828### Wersja wydania
2929
3030Jeś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.
3131
3232W przypadku innych platform hosta musisz pobrać archiwum źródeł FPC i zbudować kompilator skrośny, jak opisano poniżej.
3333
3434Pobierz najnowsze wersje cross-kompilatorów i źródła FPC tutaj: <http://freepascal.org/download.html>
3535
3636### Wersja rozwojowa/deweloperska
3737
3838Wersja rozwojowa (trunk) FPC może zawierać nowe funkcje lub poprawki błędów w porównaniu z najnowszą wydaną wersją.
3939
4040Sprawdź najnowsze źródła trunk FPC za pomocą następującego polecenia:
4141
4242`svn co http://svn.freepascal.org/svn/fpc/trunk fpcsrc`
4343
4444Teraz masz najnowsze źródła kompilatora w podfolderze `fpcsrc`.
4545
4646## Budowanie kompilatora skrośnego
4747
4848Aby utworzyć kompilator skrośny, musisz mieć działającą instalację najnowszej wersji FPC dla swojej platformy hosta.
4949
5050W 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.
5151
5252Use the similar approach to build a **`aarch64-android`** or **`i386-android`** or **`x86_64-android`** or **`mipsel-android`** cross-compiler.
5353
5454Użyj podobnego podejścia, aby zbudować kompilator skrośny **`aarch64-android`**, **`i386-android`**, **`x86_64-android`** lub **`mipsel-android`**.
5555
5656Załóżmy, że mamy następujące ścieżki:
5757
5858- Ścieżka Android NDK: `C:\Program Files\Android SDK\android-ndk-r12b`
5959- Ścieżka źródeł FPC svn: `C:\Develop\FPC\fpcsrc`
6060- Ścieżka instalacji kompilatora skrośnego: `C:\Develop\FPC\pp`
6161
6262Dodaj ś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`
6363
6464Otwórz wiersz poleceń i przejdź do katalogu głównego folderu źródeł FPC: `cd C:\Develop\FPC\fpcsrc`
6565
6666Wykonaj następujące polecenie:
6767
6868`make clean crossall crossinstall OS_TARGET=android CPU_TARGET=arm INSTALL_PREFIX=C:\Develop\FPC\pp`
6969
7070Nastę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:
7171
7272`make clean crossall crossinstall OS_TARGET=android CPU_TARGET=arm CROSSOPT="-Cparmv7a -Cfvfpv3" INSTALL_PREFIX=C:\Develop\FPC\pp`
7373
7474Teraz utwórz nowy plik `fpc.cfg` w folderze `C:\Develop\FPC\pp\bin\i386-win32` i wklej do niego następujący tekst:
7575
7676 -FuC:\Develop\FPC\pp\units\$FPCTARGET*
7777
7878 #ifdef android
7979 #ifdef cpuarm
8080 -FlC:\Program Files\Android SDK\android-ndk-r12b\platforms\android-21\arch-arm\usr\lib
8181 #endif
8282 #ifdef cpuaarch64
8383 -FlC:\Program Files\Android SDK\android-ndk-r12b\platforms\android-21\arch-arm64\usr\lib
8484 #endif
8585 #ifdef cpui386
8686 -FlC:\Program Files\Android SDK\android-ndk-r12b\platforms\android-21\arch-x86\usr\lib
8787 #endif
8888 #ifdef cpux86_64
8989 -FlC:\Program Files\Android SDK\android-ndk-r12b\platforms\android-21\arch-x86_64\usr\lib
9090 #endif
9191 #ifdef cpumips32
9292 -FlC:\Program Files\Android SDK\android-ndk-r12b\platforms\android-21\arch-mips\usr\lib
9393 #endif
9494 #endif
9595
9696## Compiling programs
9797
9898Now, when the cross-compiler is ready, you can compile programs for the Android target:
9999
100100`C:\Develop\FPC\pp\bin\i386-win32\ppcrossarm -Tandroid testprog.pas`
101101
102102## Notes
103103
104104- The compiler does NOT define **`LINUX`** during compilation! It defines **`UNIX`** and **`ANDROID`** though.\
105105 (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).
106106
107107- Shared libraries do not have **`argc/argv`** available (i.e. set to 0 or nil) because of Android.
108108
109109- The **System** unit contains some useful [Android-specific functions](https://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/rtl/android/sysandroidh.inc?view=markup).
110110
111111- The compiler and RTL do special processing for JNI shared libraries. The compiler treats a library as a JNI library only if the library exports the **`JNI_OnLoad`** function. Therefore, if you are creating a JNI shared library, always export `JNI_OnLoad`, even if it is empty.
112112
113113- For JNI shared libraries standard output and error output are redirected to the Android system log. Therefore you can use `writeln()` to write to the system log.
114114
115115- By default FPC builds PIC enabled shared libraries and executables for the Android target. PIC shared libraries work on any Android version (tested even on Android 1.5). But PIC executables can run only on Android 4.1+. To run executables on older versions of Android you need to disable PIC by passing the **`-Cg-`** switch to the compiler.
116116
117117## Known issues
118118
119-- Shared libraries compiled with FPC 3.0 does not work on Android 6.0+ and executables does not run on Android 5.0+. Starting from Android 6.0 (Marshmallow), it is required to build PIC compatible shared libraries. Starting from Android 5.0 (Lollipop), it is required to build PIC compatible executables (PIE).<span style="color:green">**\
120- PIC support for the Android target is present starting from FPC 3.0.2.**</span>\
119+- Shared libraries compiled with FPC 3.0 does not work on Android 6.0+ and executables does not run on Android 5.0+. Starting from Android 6.0 (Marshmallow), it is required to build PIC compatible shared libraries. Starting from Android 5.0 (Lollipop), it is required to build PIC compatible executables (PIE).**\
120+ PIC support for the Android target is present starting from FPC 3.0.2.**\
121121 NOTE: By default FPC 3.0.2+ builds PIC enabled shared libraries and executables for the Android target. PIC shared libraries work on any Android version (tested even on Android 1.5). But PIC executables can run only on Android 4.1+. To run executables on older versions of Android you need to disable PIC by passing the `-Cg-` switch to the compiler.
122122- Shared libraries compiled with FPC 3.0.x does not work on Android 8.0+ when an application targets API 26+. This is caused by usage of syscalls which are blocked by SECCOMP starting from Android 8.\
123- <span style="color:green">**This issue is fixed in FPC 3.2.**</span>
123+ **This issue is fixed in FPC 3.2.**
124124- If you use the **cwstring** unit in a JNI shared library, your Java application will hang when loading the library on Android 4.0 or earlier. This also applies to any unit which dynamically loads shared libraries during initialization. See more information below.\
125- <span style="color:green">**This issue is fixed in FPC 3.2.**</span>
125+ **This issue is fixed in FPC 3.2.**
126126- The **clocale** unit is not implemented in FPC 3.0.\
127- <span style="color:green">**It is implemented in FPC 3.2.**</span>
127+ **It is implemented in FPC 3.2.**
128128- The **netdb** unit is unusable in FPC 3.0 due to missing configuration of DNS servers.\
129- <span style="color:green">**This issue is fixed in FPC 3.2.**</span>
129+ **This issue is fixed in FPC 3.2.**
130130- The `Now` function always returns a GMT time in FPC 3.0.\
131- <span style="color:green">**This issue is fixed in FPC 3.2.**</span>
131+ **This issue is fixed in FPC 3.2.**
132132- The following functions return unusable paths in FPC 3.0: `GetTempDir, GetAppConfigDir, GetAppConfigFile, GetUserDir`.\
133- <span style="color:green">**This issue is fixed in FPC 3.2.**</span>
133+ **This issue is fixed in FPC 3.2.**
134134
135135## Freeze during shared library initialization on Android prior 4.1
136136
137137If 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**.
138138
139139Due 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.
140140
141-<span style="color:green">**This issue is fixed in FPC 3.2.0**</span>: 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()`.
141+**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()`.
142142
143143Therefore, if you are creating a JNI shared library, always export `JNI_OnLoad`, even if it is empty.
144144
145145Also 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.
146146
147147## See also
148148
149149- [[Android tutorial]]
150150- You can use the [[pas2jni]] utility to easily create JNI shared libraries from your existing code and use it in Android native Java applications.
151151- [[Cross compiling]] for cross compiling from Linux, macOS and Windows along with other useful cross-compilation information.
152152
153153## External links
154154
155155- [Tutorial "Lazarus and Android"](http://sourceforge.net/projects/laztoapk/files/Lazarus%20and%20Android.pdf/download) (PDF file)
156156- [How to create Android apps with Lazarus](https://pascaldelphilazarus.wordpress.com/2014/06/02/how-to-create-android-apps-with-lazarus/)
157157- [How to setup cross-compilation to Android](https://forum.lazarus.freepascal.org/index.php/topic,32553.0.html) (Lazarus Forum)
158158
159159---
160160*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](/wiki-contact).*

Back to history