Wear OS 32-bit (armeabi-v7a) build: missing TFLite libs, CDN returns 403

,

Question/Issue:
The example_motion_WearOS project in edgeimpulse/example-android-inferencing has a section in its README titled “Running on 32bit” describing the build.gradle.kts and CMakeLists.txt changes needed for armeabi-v7a builds. However, the 32-bit TFLite static libraries themselves are not provided. The download_tflite_libs.sh script only fetches android64. Where can I obtain the 32-bit .a files (or an equivalent download script / build instructions)?

I noticed https://cdn.edgeimpulse.com/build-system/tflite/android32/tflite-android32.zip
returns 403 Access Denied (not 404), suggesting the 32-bit libraries exist on your CDN
but aren’t publicly exposed. Could you either make this file public, or provide an
alternative way to obtain the 32-bit .a files?

Project ID:
944254

Context/Use case:
Running on-device activity + fall detection inference (5 classes: IDLE, WALKING, RUNNING, ROPEJUMPING, FALL) on a OnePlus Watch 2 running Wear OS 4. The watch’s OS reports as 32-bit ARM only (armeabi-v7a). I followed the example_motion_WearOS guide and the build works for arm64-v8a, but the watch cannot load 64-bit .so files at runtime.

Steps Taken:

  1. Exported my model from EI Studio as “Android library (C++)” (quantized int8) and copied edge-impulse-sdk/, model-parameters/, tflite-model/ into example_motion_WearOS/app/src/main/cpp/.
  2. Ran cd app/src/main/cpp/tflite && ./download_tflite_libs.sh — this downloads android64 only. No android32 folder is created.
  3. Ran adb shell getprop ro.product.cpu.abi on the watch — returned armeabi-v7a.
  4. Followed the README’s “Running on 32bit” section:
    • Updated build.gradle.kts: ndk { abiFilters += listOf("armeabi-v7a") } and cmake { arguments += listOf("-DANDROID_ABI=armeabi-v7a") }
    • Tried to update CMakeLists.txt with the 32-bit version from the README, which references ${CMAKE_SOURCE_DIR}/tflite/android32/libtensorflow-lite.a etc.
      5.Tried the URL https://cdn.edgeimpulse.com/build-system/tflite/android32/tflite-android32.zip
      — it exists on your CDN but returns HTTP 403 Access Denied. This suggests the file
      is there but isn’t publicly accessible.

Expected Outcome:
Either (a) an android32 equivalent of the existing android64 CDN zip, or (b) documented way to obtain/build the 12 static libraries needed by the 32-bit CMakeLists.txt shown in the README:
libtensorflow-lite.a, libxnnpack-delegate.a, libXNNPACK.a, libpthreadpool.a, libcpuinfo.a, libruy.a, libfarmhash.a, libfft2d_fftsg.a, libfft2d_fftsg2d.a, libflatbuffers.a, libabsl.a, libmicrokernels-prod.a.

Actual Outcome:
Build configured for armeabi-v7a fails at link time because the .a files don’t exist. Build configured for arm64-v8a succeeds, but the APK crashes at runtime on the watch with:
java.lang.UnsatisfiedLinkError: dlopen failed: "libedgeimpulsewearos.so" is 64-bit instead of 32-bit

Reproducibility:

  • [x] Always
  • [ ] Sometimes
  • [ ] Rarely

Environment:

  • Platform: OnePlus Watch 2 (Wear OS 4), reports as armeabi-v7a
  • Build Environment Details: Android Studio Ladybug, NDK 27.0.12077973, CMake 3.22.1, minSdk 30, targetSdk 35
  • OS Version: Windows (development machine)
  • Edge Impulse Version (Firmware): 1.92.19 (from model-parameters/model_metadata.h: EI_STUDIO_VERSION_MAJOR=1, MINOR=92, PATCH=19)
  • Edge Impulse CLI Version: N/A (not using CLI for this workflow)
  • Project Version: Deploy version 4 (EI_CLASSIFIER_PROJECT_DEPLOY_VERSION)
  • Custom Blocks / Impulse Configuration: Spectral Analysis processing block (FFT-based) + Classifier learning block. 4-second window, 20 Hz sampling, 6 axes (accelX/Y/Z + gyroX/Y/Z), 5 output classes (IDLE, WALKING, RUNNING, ROPEJUMPING, FALL). TFLite input datatype INT8 (quantized). TFLite arena size 4,499 bytes.

Logs/Attachments:
The UnsatisfiedLinkError above is the key symptom. Happy to provide full Logcat, my current CMakeLists.txt, or the build.gradle.kts if helpful.