diff --git a/musikr/build.gradle b/musikr/build.gradle index d952a7427..7f643291a 100644 --- a/musikr/build.gradle +++ b/musikr/build.gradle @@ -56,52 +56,6 @@ cargo { profile = "release" } -tasks.whenTaskAdded { task -> - if (task.name == 'mergeDebugJniLibFolders' || task.name == 'mergeReleaseJniLibFolders') { - task.dependsOn 'cargoBuild' - } - for (target in cargo.targets) { - if (task.name == "cargoBuild${target.capitalize()}") { - task.dependsOn "copy_libc++_shared${target.capitalize()}" - } - } -} - -for (target in cargo.targets) { - tasks.register("copy_libc++_shared${target.capitalize()}", Copy) { - def ndkDir = android.ndkDirectory - // hostTag, abi and archTriple from: https://developer.android.com/ndk/guides/other_build_systems - - def hostTag - if (Os.isFamily(Os.FAMILY_WINDOWS)) { - if (Os.isArch("x86_64") || Os.isArch("amd64")) { - hostTag = "windows-x86_64" - } else { - hostTag = "windows" - } - } else if (Os.isFamily(Os.FAMILY_MAC)) { - hostTag = "darwin-x86_64" - } else { - hostTag = "linux-x86_64" - } - - def (abi, archTriple) = [ - arm: ['armeabi-v7a', 'arm-linux-androideabi'], - arm64: ['arm64-v8a', 'aarch64-linux-android'], - x86: ['x86', 'i686-linux-android'], - x86_64: ['x86_64', 'x86_64-linux-android'], - ][target] - - def from_path = "$ndkDir/toolchains/llvm/prebuilt/$hostTag/sysroot/usr/lib/$archTriple/libc++_shared.so" - def into_path = layout.buildDirectory.dir("rustJniLibs/android/$abi") - - assert file(from_path).exists() - - from from_path - into into_path - } -} - dependencies { // Kotlin implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" diff --git a/musikr/src/main/jni/Cargo.lock b/musikr/src/main/jni/Cargo.lock index a899bbbfc..22745bd0e 100644 --- a/musikr/src/main/jni/Cargo.lock +++ b/musikr/src/main/jni/Cargo.lock @@ -196,6 +196,7 @@ dependencies = [ "cxx", "cxx-build", "jni", + "link-cplusplus", ] [[package]] diff --git a/musikr/src/main/jni/Cargo.toml b/musikr/src/main/jni/Cargo.toml index f2da31def..15a10d8d0 100644 --- a/musikr/src/main/jni/Cargo.toml +++ b/musikr/src/main/jni/Cargo.toml @@ -8,8 +8,14 @@ name = "metadatajni" crate-type = ["cdylib"] [dependencies] +link-cplusplus = { version = "1.0.9", features = ["nothing"] } cxx = { version = "1.0.137", default-features = false, features = ["alloc"] } jni = { version = "0.21.1", default-features = false } [build-dependencies] cxx-build = "1.0.137" + +[profile.release] +lto = true +codegen-units = 1 +panic = "abort" diff --git a/musikr/src/main/jni/build.rs b/musikr/src/main/jni/build.rs index 0b4c6537e..57f33ff81 100644 --- a/musikr/src/main/jni/build.rs +++ b/musikr/src/main/jni/build.rs @@ -4,6 +4,11 @@ use std::process::Command; use cxx_build; fn main() { + // List all envs + for (key, value) in env::vars() { + println!("{}: {}", key, value); + } + let working_dir = env::current_dir().expect("Failed to get current working directory"); let target = env::var("TARGET").expect("TARGET env var not set"); let working_dir = Path::new(&working_dir); @@ -105,18 +110,22 @@ fn main() { println!("cargo:rustc-link-search=native={}/lib", arch_pkg_dir.display()); println!("cargo:rustc-link-lib=static=tag"); + // println!("cargo:rustc-link-lib=c++_static"); // Build the shim and cxx bridge together - cxx_build::bridge("src/taglib/ffi.rs") - .file("shim/iostream_shim.cpp") + let mut builder = cxx_build::bridge("src/taglib/ffi.rs"); + builder.file("shim/iostream_shim.cpp") .file("shim/file_shim.cpp") .file("shim/tk_shim.cpp") .include(format!("taglib/pkg/{}/include", arch)) .include("shim") .include(".") // Add the current directory to include path - .flag_if_supported("-std=c++14") - .cpp_link_stdlib("c++_shared") // Use shared C++ runtime for Android compatibility - .compile("taglib_cxx_bindings"); + .flag_if_supported("-std=c++14"); + + if is_android { + builder.cpp_link_stdlib("c++_static"); // Use shared C++ runtime for Android compatibility + } + builder.compile("taglib_cxx_bindings"); // Rebuild if shim files change println!("cargo:rerun-if-changed=shim/iostream_shim.hpp");