Build silent failure when using "dx build" on android with oboe
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
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
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! 😄
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.
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" }
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