dioxus icon indicating copy to clipboard operation
dioxus copied to clipboard

Build silent failure when using "dx build" on android with oboe

Open LaurentMazare opened this issue 1 year ago • 4 comments

Problem

When building a barebone dioxus project for android with the dx build command, the build process silently fails. If an apk file has already been built before that, no error is returned and the apk is unchanged. If no apk is present - e.g. after removing target, the bundling step here fails as the copy step does not have a source file.

Below is a repro for the issue together with the process output. This only happens when the oboe dependency is used.

Steps To Reproduce

I've put a repro in this repo dioxus-test.

$ sh build.sh
   ...
   0.747s  INFO Compiling [317/532]: dioxus_mobile
   0.747s  INFO Compiling [318/532]: dioxus
   1.36s  INFO Bundling app...
   1.36s ERROR err=Other(Failed to write main executable

Caused by:
    0: I/O Error: No such file or directory (os error 2)
    1: No such file or directory (os error 2))
   1.38s ERROR err=Other(Failed to write main executable

Caused by:
    0: I/O Error: No such file or directory (os error 2)
    1: No such file or directory (os error 2))

Expected behavior

I would expect the compiling step to fail and provide some compilation error if any.

Environment:

  • Dioxus version: dioxus 0.6.0, dx cli 0.6.1.
  • Rust version: rustc 1.82.0 (f6e511eec 2024-10-15)
  • OS info: linux 6.11.5-arch1-1
  • App platform: mobile - android

Questionnaire

LaurentMazare avatar Jan 02 '25 20:01 LaurentMazare

I found a fix here: https://github.com/fzyzcjy/flutter_rust_bridge/issues/2209#issuecomment-2251126662 Turning on the feature shared-stdcxx for oboe, and copying $ANDROID_NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/libc++_shared.so into \target\dx<crate>\debug\android\app\app\src\main\jniLibs makes oboe functional. Although I still am confused why there's no error when it fails to create the executable.

rhaskia avatar Jan 18 '25 00:01 rhaskia

I have the same problem, I managed to fix the compilation error as mentioned above, but Dioxus still does not include libc++_shared.so in the final apk-file, so the app fails to start.

java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found: needed by /data/app/~~oR8tD2nsII_TInqsB8tGng==/com.example.SoundOs-dIPSOOTdU8qrIguAPFX8dA==/base.apk!/lib/arm64-v8a/libdioxusmain.so in namespace clns-

And by inspecting the apk-file, we can indeed see that the library is not there (if it was, we would see it as an additional entry like lib/arm64-v8a/libc++_shared.so)

unzip -l target/dx/sound-os/debug/android/app/app/build/outputs/apk/debug/app-debug.apk | grep lib/
217672344  1981-01-01 01:01   lib/arm64-v8a/libdioxusmain.so

Any suggestion for a fix or a workaround would be greatly appreciated! 😄

ekarlsn avatar Feb 20 '25 21:02 ekarlsn

cpal (which most major audio libraries use) now uses ndk::audio instead of oboe (#961), which I believe removes the C++ bindings and means this error should not show up unless you are using an older version of an audio library or using oboe directly.

rhaskia avatar May 16 '25 20:05 rhaskia

this might help until final stable version of cpal be released

[dependencies]
cpal = { git = "https://github.com/RustAudio/cpal", branch = "master" }

for sub dependency cases:

[patch.crates-io]
cpal = { git = "https://github.com/RustAudio/cpal", branch = "master" }

WilledgeR avatar May 24 '25 08:05 WilledgeR

Apparently there's a number of flags build tools should set for the cc-rs crate. cargo ndk does it properly, so I've dug into their setup and ported the flags over to dx. This should be fixed in https://github.com/DioxusLabs/dioxus/pull/4376

jkelleyrtp avatar Jul 08 '25 16:07 jkelleyrtp