#!/bin/bash # UniFFI Android Build Script # Generates Kotlin bindings and Android libraries set -e echo "๐Ÿค– Building UniFFI Android Library..." # Clean previous Android builds echo "๐Ÿงน Cleaning previous Android builds..." rm -rf bindings/android/ mkdir -p bindings/android # Install required tools if ! command -v uniffi-bindgen &> /dev/null; then echo "๐Ÿ“ฆ Installing uniffi_bindgen..." cargo install uniffi_bindgen --bin uniffi-bindgen fi if ! command -v cargo-ndk &> /dev/null; then echo "๐Ÿ“ฆ Installing cargo-ndk..." cargo install cargo-ndk fi # Android targets for cargo-ndk ANDROID_ABIS=( "arm64-v8a" # ARM64 devices "armeabi-v7a" # ARM32 devices "x86_64" # x86_64 emulator "x86" # x86 emulator ) echo "๐Ÿ”ง Building Rust library for Android targets using cargo-ndk..." for abi in "${ANDROID_ABIS[@]}"; do echo "Building for $abi..." cargo ndk --target $abi --platform 21 build --release --features uniffi done echo "โšก Generating Kotlin bindings..." # Find the first available library for binding generation if [ -f "target/aarch64-linux-android/release/libchurch_core.so" ]; then LIB_FILE="target/aarch64-linux-android/release/libchurch_core.so" else # Find any available library LIB_FILE=$(find target -name "libchurch_core.so" -type f | head -1) fi # Generate Kotlin bindings using uniffi_bindgen uniffi-bindgen generate \ src/church_core.udl \ --language kotlin \ --out-dir bindings/android \ --lib-file "$LIB_FILE" echo "๐Ÿ“ Organizing Android libraries..." # Create JNI library structure mkdir -p bindings/android/jniLibs/arm64-v8a mkdir -p bindings/android/jniLibs/armeabi-v7a mkdir -p bindings/android/jniLibs/x86_64 mkdir -p bindings/android/jniLibs/x86 # Copy libraries to JNI structure (cargo-ndk puts them in different locations) if [ -f "target/aarch64-linux-android/release/libchurch_core.so" ]; then cp target/aarch64-linux-android/release/libchurch_core.so bindings/android/jniLibs/arm64-v8a/ fi if [ -f "target/armv7-linux-androideabi/release/libchurch_core.so" ]; then cp target/armv7-linux-androideabi/release/libchurch_core.so bindings/android/jniLibs/armeabi-v7a/ fi if [ -f "target/x86_64-linux-android/release/libchurch_core.so" ]; then cp target/x86_64-linux-android/release/libchurch_core.so bindings/android/jniLibs/x86_64/ fi if [ -f "target/i686-linux-android/release/libchurch_core.so" ]; then cp target/i686-linux-android/release/libchurch_core.so bindings/android/jniLibs/x86/ fi echo "๐Ÿ“ฆ Creating Android README..." cat > bindings/android/README.md << EOF # Church Core Android Bindings This directory contains the generated Kotlin bindings and native libraries for the church-core Rust crate. ## Files: - \`uniffi/\` - Generated Kotlin bindings - \`jniLibs/\` - Native libraries for Android architectures - \`arm64-v8a/\` - ARM64 devices (modern phones) - \`armeabi-v7a/\` - ARM32 devices (older phones) - \`x86_64/\` - x86_64 emulator - \`x86/\` - x86 emulator ## Integration: 1. Copy the Kotlin files from \`uniffi/\` to your Android project's \`src/main/java/\` directory 2. Copy the \`jniLibs/\` directory to your Android project's \`src/main/\` directory 3. Add JNA dependency to your \`build.gradle\`: ```gradle implementation 'net.java.dev.jna:jna:5.13.0@aar' ``` ## Usage: ```kotlin import uniffi.church_core.* // Fetch events val eventsJson = fetchEventsJson() // Fetch sermons val sermonsJson = fetchSermonsJson() // All other functions from the UDL file are available ``` EOF echo "โœ… UniFFI Android library build complete!" echo "๐Ÿ“ Generated files in bindings/android/:" echo " - uniffi/ (Kotlin bindings)" echo " - jniLibs/ (Native libraries for all Android architectures)" echo " - README.md (Integration instructions)" echo "" echo "๐ŸŽฏ Ready for Android integration!" echo "๐Ÿ’ก Follow the README.md instructions to integrate into your Android project"