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.

Hi @Prateek_krishali - I’ve asked one of my teammates about this. Stay tuned!

OK two things:

  1. I have asked my colleague who created that repo about adding a download link for the tflite-android32.zip.
  2. I knew we had a blog post coming out soon that compiles the source Android C++ files for 32bit that you can refer to as an example. It was posted minutes ago. I’ve linked the post below along with the associated repo.

Blog: Gesture-Controlled Smart Lights with a Galaxy Watch and Edge Impulse
Repo: smartwatch_gesture_control

Hi @Prateek_krishali

@AIWintermuteAI @heathb and I will work on this to reproduce and test the workflow again, we had a recent update to tflite and it may have impacted this. Thanks for alerting me @brianmcfadden

We will update early next week once a review is complete.

Best

Eoin

Hi @brianmcfadden — thanks for the quick follow-up!

I tried cloning the smartwatch_gesture_control repo from the new blog post, but the app/ folder appears to be incomplete:

  • app/build.gradle.kts is empty (0 bytes)
  • Repo shows only ~2 commits in history
  • Same issue with the linked smartwatch_data_collector repo

Android Studio sync fails with:

app debug:armeabi-v7a failed to configure C/C++
com.google.gson.stream.MalformedJsonException: line 1 column 1 path $

Consistent with empty CMake config files. Could the app/ source (build.gradle.kts, AndroidManifest, MainActivity, CMakeLists.txt, JNI sources) be pushed when your colleague gets a chance?

Context: my Combined_Fall_HAR_Detection export already contains edge-impulse-sdk/tensorflow/lite/micro/ source, so the CMake-from-source approach should work as soon as the Wear OS scaffolding is available. Happy to test immediately.

Thanks!

Thanks @Eoin — appreciate you taking this on.

Standing by to test as soon as the repos are updated. Will report back here once I’ve verified the build works with my model.

Best, Prateek

@salmanedgeimpulse - could you please see the comments above about the smartwatch_gesture_control and smartwatch_data_collector repos.

hi @brianmcfadden any update regarding the repos ??

Hi @Prateek_krishali . The smartwatch_gesture_control and smartwatch_data_collector repos shall be ready to download and build. The previous commit corruped the .kts file which should not be fixed. Let me know if you have any further issues.

Hi @salmanedgeimpulse — quick update on both repos:

smartwatch_data_collector — still appears empty after the latest push (“Replace with clean files”). The file tree shows no source files, no app/, no build.gradle.kts. Could you verify the files were pushed successfully to main?

smartwatch_gesture_control — can see files are now present. Will clone/pull and test immediately. Will report back with results.

Thanks!

Hi @Prateek_krishali . Try pulling again.