From d269600aa75eb00e7d21f7f7874005312fbdab63 Mon Sep 17 00:00:00 2001 From: Siavash Sameni Date: Fri, 10 Apr 2026 21:43:47 +0400 Subject: [PATCH] =?UTF-8?q?fix(build):=20build-tauri-android.sh=20?= =?UTF-8?q?=E2=80=94=20copy=20libc++=5Fshared.so=20into=20jniLibs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause of "wzp-native not loaded" at runtime on opus-DRED-v2 APK: libwzp_native.so has a NEEDED entry for libc++_shared.so (because crates/wzp-native/build.rs uses cpp_link_stdlib(Some("c++_shared"))), but the APK only contained: lib/arm64-v8a/libwzp_desktop_lib.so (192 MB) lib/arm64-v8a/libwzp_native.so (683 KB) No libc++_shared.so → Android's dynamic linker fails the dlopen of libwzp_native.so at runtime with "library libc++_shared.so not found", and every audio path that routes through wzp_native (capture, playout, register, direct call) refuses to start. Diagnosis: - readelf -d libwzp_native.so shows NEEDED libc++_shared.so - python zipfile listing of the APK confirms libc++_shared.so is absent from lib/arm64-v8a/ - scripts/build-and-notify.sh (the legacy wzp-android build path) already had this fix at lines 126-134 with an explicit comment: "cargo-ndk may not copy libc++_shared.so — grab it from the NDK if missing". That fix was never ported to build-tauri-android.sh when the Tauri mobile pipeline was set up. Fix: after `cargo ndk build -p wzp-native --release` produces libwzp_native.so into jniLibs, copy libc++_shared.so from the NDK sysroot (same find pattern as build-and-notify.sh) into the same jniLibs dir. Abort with a clear error if the NDK doesn't have the file. Also noting the 191 MB vs 359 MB size discrepancy the user saw: that's almost entirely libwzp_desktop_lib.so being a 192 MB debug build. The old working APK was probably a release build (smaller main lib) or included multiple arches (doubling/tripling the .so count). The size is cosmetic — the crash is the real issue, and libc++_shared.so is ~2 MB so this fix doesn't close the size gap. Can investigate the size difference separately after register + direct call work again. Co-Authored-By: Claude Opus 4.6 (1M context) --- scripts/build-tauri-android.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/scripts/build-tauri-android.sh b/scripts/build-tauri-android.sh index 178081b..e28a440 100755 --- a/scripts/build-tauri-android.sh +++ b/scripts/build-tauri-android.sh @@ -199,6 +199,26 @@ else echo ">>> WARNING: libwzp_native.so not produced" fi +# ─── libc++_shared.so — required by wzp-native at runtime ────────────── +# wzp-native/build.rs uses cpp_link_stdlib(Some("c++_shared")) which adds +# a NEEDED entry for libc++_shared.so to libwzp_native.so. cargo-ndk does +# NOT copy the actual libc++_shared.so into jniLibs, so unless we copy it +# explicitly, the APK ships without it and Android's dynamic linker fails +# the dlopen with "library libc++_shared.so not found" at runtime. Same +# fix that build-and-notify.sh has had for the legacy wzp-android path +# (lines 126-134 there) — ported here for the Tauri pipeline. +if [ ! -f "$JNI_ABI_DIR/libc++_shared.so" ]; then + echo ">>> libc++_shared.so missing, copying from NDK..." + NDK_LIBCXX=$(find "$ANDROID_NDK_HOME" -name "libc++_shared.so" -path "*/aarch64-linux-android/*" | head -1) + if [ -n "$NDK_LIBCXX" ]; then + cp "$NDK_LIBCXX" "$JNI_ABI_DIR/" + ls -lh "$JNI_ABI_DIR/libc++_shared.so" + else + echo ">>> ERROR: libc++_shared.so not found in NDK — APK will crash at dlopen time" + exit 1 + fi +fi + echo ">>> cargo tauri android build ${PROFILE_FLAG} --target aarch64 --apk" cargo tauri android build ${PROFILE_FLAG} --target aarch64 --apk