From 61daf8f14377a192598fe42b912cc5cdc1900918 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 19 Apr 2025 16:08:07 -0400 Subject: [PATCH] Fix android build issues (fixes #950) --- .github/workflows/main.yml | 1 + build-scripts/build-android-ndk | 41 +++++++++++++++++++++++++++++++++++++++++ libqpdf/CMakeLists.txt | 11 +++++------ 3 files changed, 47 insertions(+), 6 deletions(-) create mode 100755 build-scripts/build-android-ndk diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8fe8acd..31bf9a0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -163,6 +163,7 @@ jobs: - test-alt-zlib - test-unsigned-char - test-c++-next + - build-android-ndk steps: - uses: actions/checkout@v4 - name: ${{ matrix.script }} diff --git a/build-scripts/build-android-ndk b/build-scripts/build-android-ndk new file mode 100755 index 0000000..0650357 --- /dev/null +++ b/build-scripts/build-android-ndk @@ -0,0 +1,41 @@ +#!/bin/bash +set -xeo pipefail +cd $(dirname $0)/.. + +# Build a static libqpdf for android with an ABI version <= 24. This +# is just to exercise that configuring for that platform works. + +declare -a android_flags +android_flags=( \ + -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" \ + -DANDROID_ABI=armeabi-v7a \ + -DANDROID_PLATFORM=android-21 \ +) + +rm -rf android-work build-android +mkdir android-work +pushd android-work +export WORK=$PWD +git clone https://github.com/libjpeg-turbo/libjpeg-turbo +cd libjpeg-turbo +cmake -S . -B build \ + "${android_flags[@]}" \ + -DCMAKE_INSTALL_PREFIX="$WORK" \ + -DENABLE_STATIC=ON \ + -DENABLE_SHARED=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON +make -C build -j$(nproc) +make -C build install +popd + +export CMAKE_PREFIX_PATH=$WORK LDFLAGS="-L$WORK/lib" +cmake -S . -B build-android \ + "${android_flags[@]}" \ + -DCMAKE_BUILD_TYPE=RelWithDebinfo \ + -DUSE_IMPLICIT_CRYPTO=OFF \ + -DBUILD_SHARED_LIBS=OFF \ + -DBUILD_STATIC_LIBS=ON \ + -DREQUIRE_CRYPTO_NATIVE=ON + +cmake --build build-android -t libqpdf --verbose -j$(nproc) -- -k +file build-android/libqpdf/CMakeFiles/libqpdf_object.dir/QUtil.cc.o | grep 'ARM, EABI5' diff --git a/libqpdf/CMakeLists.txt b/libqpdf/CMakeLists.txt index 371cd6b..12d7018 100644 --- a/libqpdf/CMakeLists.txt +++ b/libqpdf/CMakeLists.txt @@ -349,7 +349,11 @@ int main(int argc, char* argv[]) { LFS_WITHOUT_MACROS) check_c_source_compiles( -"#define _FILE_OFFSET_BITS 64 +"#if !(defined(__ANDROID__) && __ANDROID_API__ <= 24) +// Defining _FILE_OFFSET_BITS on Android <= 24 is known to +// produce incorrect results. +#define _FILE_OFFSET_BITS 64 +#endif #include #include int main(int argc, char* argv[]) { @@ -359,11 +363,6 @@ int main(int argc, char* argv[]) { if(LFS_WITH_MACROS AND NOT LFS_WITHOUT_MACROS) set(_FILE_OFFSET_BITS 64) endif() - -# fseeko may not exist with _FILE_OFFSET_BITS=64 but can exist with -# _FILE_OFFSET_BITS unset or 32 (e.g. Android ARMv7 with NDK 26b and -# API level < 24) so we need to test fseeko after testing for -# _FILE_OFFSET_BITS. See https://github.com/qpdf/qpdf/issues/950. check_symbol_exists(fseeko "stdio.h" HAVE_FSEEKO) check_symbol_exists(fseeko64 "stdio.h" HAVE_FSEEKO64) -- libgit2 0.21.4