mozilla / rust-android-gradle

Apache License 2.0
1.03k stars 67 forks source link

AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "libc.so.6" not found #100

Closed lattice0 closed 2 years ago

lattice0 commented 2 years ago

I'm getting this strange error:

05-07 17:52:04.502 6044 6044 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: library "libc.so.6" not found: needed by /data/app/~~Uk6xadUW-y6fg0oa4zCCHQ==/com.example.example_app-iwlCB6t4S0WNHQkaW2NUBg==/lib/x86_64/libsomething.so in namespace classloader-namespace

as if the lib were being compiled for linux, not android, based on things I found on the internet about this error. Unfortunately none of them had solutions.

I'm loading like this:

class MainActivity: FlutterActivity() {
    companion object {
        init {
            System.loadLibrary("something")
        }
    }
}

Here's the rustc linking:

Running rustc --crate-name something --edition=2021 src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type staticlib --crate-type cdylib --crate-type lib --emit=dep-info,link -C opt-level=3 -C embed-bitcode=no -C metadata=ea3fbc776f8da400 --out-dir /home/dev/project/libsomething/target/x86_64-linux-android/release/deps --target x86_64-linux-android -C linker=/home/dev/project/something_app/build/linker-wrapper/linker-wrapper.sh -L dependency=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps -L dependency=/home/dev/project/libsomething/target/release/deps --extern ascii_table=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libascii_table-67416b3e4c561087.rlib --extern async_smoltcp=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libasync_smoltcp-54f726d304834cc5.rlib --extern downcast_rs=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libdowncast_rs-25ee6a236976a8ba.rlib --extern env_logger=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libenv_logger-f91f74e1e0880e07.rlib --extern etherparse=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libetherparse-cec2146ebd660273.rlib --extern flutter_rust_bridge=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libflutter_rust_bridge-99782acb08a21d78.rlib --extern futures=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libfutures-2e81834c558cb468.rlib --extern libc=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/liblibc-f50b0f21a3e337ac.rlib --extern libopenvpn3=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/liblibopenvpn3-8bfd37ae455e264b.rlib --extern libsomethingprofile_protobuf_rust=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/liblibsomethingprofile_protobuf_rust-c574f7746610eb4b.rlib --extern log=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/liblog-cfe4eef77fe99d24.rlib --extern no_spam=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libno_spam-acb361757b38610d.rlib --extern on_the_fly_swap=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libon_the_fly_swap-6c2c1e5289c91e4a.rlib --extern phf=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libphf-798e5e7bd4ebd202.rlib --extern protobuf=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libprotobuf-97ebf9367ef92dab.rlib --extern rand=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/librand-1201d04ad4e37af4.rlib --extern retina=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libretina-79ba801740c29be2.rlib --extern rsmpeg=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/librsmpeg-7ee02cc125452f37.rlib --extern simple_socket=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libsimple_socket-cd56f31c7a0fb562.rlib --extern simple_vpn=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libsimple_vpn-f0f0c1f93eef39d9.rlib --extern termion=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libtermion-7fb16864cfc0fdb6.rlib --extern thiserror=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libthiserror-abfc7c2458606f5d.rlib --extern tokio=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/libtokio-8e128fa79ddedc20.rlib --extern url=/home/dev/project/libsomething/target/x86_64-linux-android/release/deps/liburl-e0708c24008d89f6.rlib -L /usr/lib/x86_64-linux-gnu/ -l static=z -l dylib=dl -l static=X11 -l dylib=vdpau -l dylib=va -l dylib=va-drm -l dylib=va-x11 -l dylib=xcb -L native=/home/dev/project/libsomething/target/x86_64-linux-android/release/build/libopenvpn3-6763bcfb718b66f5/out -L native=/home/dev/project/build/ffmpeg/build/linux/x86_64_generic/lib/

All my setup can be found at https://github.com/lattice0/flutter_bug/tree/d1c738ac799f0213ac2c1e04c226db0f1058ba23

ncalexan commented 2 years ago

First, I think you want

[lib]
crate_type = ["cdylib"]

After that, my guess is that you are getting tripped up with the special function main, since that does interact with the C runtime. I'd try exporting a random function name, like:

#[no_mangle]
pub extern "C" fn test_function() {
}

Good luck!

lattice0 commented 2 years ago

For some reason my .so ends up requiring a link to libc6:

ldd target/x86_64-linux-android/release/libsomething.so 
        linux-vdso.so.1 (0x00007ffd6478e000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff612e8c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff6130f2000)

I did


fn main() {
    println!("cargo:rerun-if-changed=build.rs");
    let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap();
    // --------- this was previously being called unconditionally. Making it linux-only solved the problem
    if target_os == "linux" {
        println!("cargo:rustc-link-search=/usr/lib/x86_64-linux-gnu/");
        println!("cargo:rustc-link-lib=static=z");
        println!("cargo:rustc-link-lib=dylib=dl");
        println!("cargo:rustc-link-lib=static=X11");
        println!("cargo:rustc-link-lib=dylib=vdpau");
        println!("cargo:rustc-link-lib=dylib=va");
        println!("cargo:rustc-link-lib=dylib=va-drm");
        println!("cargo:rustc-link-lib=dylib=va-x11");
        println!("cargo:rustc-link-lib=dylib=xcb");
    }
}