Skip to content

Build fixes to allow using the epoll native transport on Android#16016

Merged
normanmaurer merged 2 commits intonetty:4.2from
faenil:android-epoll-fixes-4.2.7.Final
Dec 11, 2025
Merged

Build fixes to allow using the epoll native transport on Android#16016
normanmaurer merged 2 commits intonetty:4.2from
faenil:android-epoll-fixes-4.2.7.Final

Conversation

@faenil
Copy link
Copy Markdown
Contributor

@faenil faenil commented Dec 11, 2025

Note: more details are provided in the single commit messages.

Motivation:

the epoll native transport currently fails to compile on Android, due to a couple of compilation failures

transport-native-unix-common/src/main/c/netty_unix_errors.c:47:15: error: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int' [-Wint-conversion]
   47 |         char* tmp = strerror_r(errnum, strerrbuf, buflen);
      |               ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

and

transport-native-unix-common/src/main/c/netty_unix_socket.c:449:9: error: call to undeclared library function 'bzero' with type 'void (void *, unsigned long)'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
  449 |         bzero(&addr, sizeof(addr)); // Zap addr so we can strlen(addr.sun_path) later. See unix(4).
      |         ^
transport-native-unix-common/src/main/c/netty_unix_socket.c:449:9: note: include the header <strings.h> or explicitly provide a declaration for 'bzero'
  • netty_unix_socket.c uses bzero (in a single place). bzero is defined in strings.h, which however does not seem to be pulled in by default in Android with the current includes.
    Moreover, bzero is deprecated and was dropped in POSIX 2018. See POSIX 2018 docs and relevant AOSP 16 code.
  • netty_unix_errors.c currently uses the GNU strerror_r on Android.
    Android, however, only exposes the GNU strerror_r when _GNU_SOURCE is defined and only on API level 23+.
    See relevant AOSP 16 code

Modification:

  • a dedicated repository was spun up to allow reproducing the build failures
    • it is an Android project containing the necessary plumbing to build the epoll native transport
    • it can be easily built by following the instructions in the README in the project repo
  • replace the deprecated bzero with memset, already used for the very same purpose in many places in the same file.
  • use the XSI strerror_r on Android, when _GNU_SOURCE is not defined

Result:

  • epoll native transport builds and Epoll.ensureAvailability() succeeds on Android.
    Tested on Android 16 emulator image BP41.250916.009.A1 (x86_64), NDK 27.0.12077973

Motivation:

netty_unix_errors.c fails to build on Android platforms due to the
the current logic defaulting to the GNU strerror_r, which is not
exposed on Android when _GNU_SOURCE is not defined.

Android exposes the XSI strerror_r by default, so it can be used directly.
https://cs.android.com/android/platform/superproject/+/android16-release:bionic/libc/include/string.h;l=145?q=string.h

The GNU version is also available but only on API level 23+ (and
only when _GNU_SOURCE is defined), as explained at the link above.

Modifications:

- add __ANDROID__ to the platforms that use the XSI strerror_r when
  _GNU_SOURCE is not defined

Result:

netty_unix_errors.c compiles successfully on Android.
Tested on Android 16 emulator image, NDK 27.0.12077973
Motivations:
- netty_unix_socket.c fails to compile on Android (NDK 27.0.12077973).
- bzero is deprecated and was removed in POSIX 2018.
  The recommendation is to replace it with memset
  See https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xsh_chap03.html
  and https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xsh_chap01.html

Modifications:
- replace bzero with memset, already used elsewhere in the same file.
  The alternative would be to include <strings.h> on __ANDROID__, which
  provides a definition for bzero
  https://cs.android.com/android/platform/superproject/+/android16-release:bionic/libc/include/strings.h;l=69
  but given that bzero is deprecated and this .c file already uses memset
  extensively for the very same purpose of zeroing out address structs,
  then it was deemed more sensible to bring consistency and replace the
  deprecated call.

Result:
- netty_unix_socket.c compiles successfully on Android.
  Tested on Android 16 emulator and NDK 27.0.12077973
- higher level result: the epoll native transport now can be
  compiled and used on Android (see tested environment above)
@faenil
Copy link
Copy Markdown
Contributor Author

faenil commented Dec 11, 2025

cc @chrisvest FYI, as author of the commit introducing the bzero line that's being changed
d1a8cd2

@faenil
Copy link
Copy Markdown
Contributor Author

faenil commented Dec 11, 2025

There is also the option of using memset_s but I haven't gone in that direction as the rest of the file is relying on memset so I leaned towards caution and consistency to any potential of regressions.

Let me know if you feel otherwise 👍

@normanmaurer normanmaurer merged commit d011634 into netty:4.2 Dec 11, 2025
16 of 19 checks passed
normanmaurer pushed a commit that referenced this pull request Dec 11, 2025
)

**Note**: more details are provided in the single commit messages.

## Motivation:
the epoll native transport currently fails to compile on Android, due to
a couple of compilation failures
```
transport-native-unix-common/src/main/c/netty_unix_errors.c:47:15: error: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int' [-Wint-conversion]
   47 |         char* tmp = strerror_r(errnum, strerrbuf, buflen);
      |               ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```
and
```
transport-native-unix-common/src/main/c/netty_unix_socket.c:449:9: error: call to undeclared library function 'bzero' with type 'void (void *, unsigned long)'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
  449 |         bzero(&addr, sizeof(addr)); // Zap addr so we can strlen(addr.sun_path) later. See unix(4).
      |         ^
transport-native-unix-common/src/main/c/netty_unix_socket.c:449:9: note: include the header <strings.h> or explicitly provide a declaration for 'bzero'
```
- `netty_unix_socket.c` uses `bzero` (in a single place). `bzero` is
defined in `strings.h`, which however does not seem to be pulled in by
default in Android with the current includes.
Moreover, `bzero` is deprecated and was dropped in POSIX 2018. See
[POSIX 2018
docs](https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xsh_chap03.html)
and [relevant AOSP 16
code](https://cs.android.com/android/platform/superproject/+/android16-release:bionic/libc/include/strings.h;l=69).
- `netty_unix_errors.c` currently uses the GNU `strerror_r` on Android.
Android, however, only exposes the GNU `strerror_r` when `_GNU_SOURCE`
is defined and only on API level 23+.
See [relevant AOSP 16
code](https://cs.android.com/android/platform/superproject/+/android16-release:bionic/libc/include/string.h;l=145?q=string.h)

## Modification:
- a [dedicated
repository](https://github.com/faenil/NettyEpollAndroidBuildFailureTest)
was spun up to allow reproducing the build failures
- it is an Android project containing the necessary plumbing to build
the epoll native transport
- it can be easily built by following the instructions in the `README`
in the project repo
- replace the deprecated `bzero` with `memset`, already used for the
very same purpose in many places in the same file.
- use the XSI `strerror_r` on Android, when `_GNU_SOURCE` is not defined

## Result:
- epoll native transport builds and `Epoll.ensureAvailability()`
succeeds on Android.
Tested on Android 16 emulator image `BP41.250916.009.A1` (x86_64), NDK
`27.0.12077973`
normanmaurer pushed a commit that referenced this pull request Dec 11, 2025
)

**Note**: more details are provided in the single commit messages.

## Motivation:
the epoll native transport currently fails to compile on Android, due to
a couple of compilation failures
```
transport-native-unix-common/src/main/c/netty_unix_errors.c:47:15: error: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int' [-Wint-conversion]
   47 |         char* tmp = strerror_r(errnum, strerrbuf, buflen);
      |               ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```
and
```
transport-native-unix-common/src/main/c/netty_unix_socket.c:449:9: error: call to undeclared library function 'bzero' with type 'void (void *, unsigned long)'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
  449 |         bzero(&addr, sizeof(addr)); // Zap addr so we can strlen(addr.sun_path) later. See unix(4).
      |         ^
transport-native-unix-common/src/main/c/netty_unix_socket.c:449:9: note: include the header <strings.h> or explicitly provide a declaration for 'bzero'
```
- `netty_unix_socket.c` uses `bzero` (in a single place). `bzero` is
defined in `strings.h`, which however does not seem to be pulled in by
default in Android with the current includes.
Moreover, `bzero` is deprecated and was dropped in POSIX 2018. See
[POSIX 2018
docs](https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xsh_chap03.html)
and [relevant AOSP 16
code](https://cs.android.com/android/platform/superproject/+/android16-release:bionic/libc/include/strings.h;l=69).
- `netty_unix_errors.c` currently uses the GNU `strerror_r` on Android.
Android, however, only exposes the GNU `strerror_r` when `_GNU_SOURCE`
is defined and only on API level 23+.
See [relevant AOSP 16
code](https://cs.android.com/android/platform/superproject/+/android16-release:bionic/libc/include/string.h;l=145?q=string.h)

## Modification:
- a [dedicated
repository](https://github.com/faenil/NettyEpollAndroidBuildFailureTest)
was spun up to allow reproducing the build failures
- it is an Android project containing the necessary plumbing to build
the epoll native transport
- it can be easily built by following the instructions in the `README`
in the project repo
- replace the deprecated `bzero` with `memset`, already used for the
very same purpose in many places in the same file.
- use the XSI `strerror_r` on Android, when `_GNU_SOURCE` is not defined

## Result:
- epoll native transport builds and `Epoll.ensureAvailability()`
succeeds on Android.
Tested on Android 16 emulator image `BP41.250916.009.A1` (x86_64), NDK
`27.0.12077973`
@chrisvest
Copy link
Copy Markdown
Member

thanks, @faenil !

@normanmaurer normanmaurer added this to the 4.2.8.Final milestone Dec 11, 2025
@faenil
Copy link
Copy Markdown
Contributor Author

faenil commented Dec 11, 2025

thanks for the quick reviews! Happy to help!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants