robius-authentication 0.1.1

Rust abstractions for multi-platform native authentication: biometrics, fingerprint, password, TouchID, FaceID, Windows Hello, etc.
use std::{env, path::PathBuf};

const JAVA_FILE_RELATIVE_PATH: &str = "src/sys/android/AuthenticationCallback.java";

fn main() {
    let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap();

    if target_os == "android" {
        println!("cargo:rerun-if-changed={JAVA_FILE_RELATIVE_PATH}");

        let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
        let java_file =
            PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()).join(JAVA_FILE_RELATIVE_PATH);

        let android_jar_path =
            android_build::android_jar(None).expect("Failed to find android.jar");

        // Compile the .java file into a .class file.
        assert!(
            android_build::JavaBuild::new()
                .class_path(android_jar_path.clone())
                .classes_out_dir(out_dir.clone())
                .file(java_file)
                .compile()
                .expect("failed to acquire exit status for javac invocation")
                .success(),
            "javac invocation failed"
        );

        let class_file = out_dir
            .join("robius")
            .join("authentication")
            .join("AuthenticationCallback.class");

        let d8_jar_path = android_build::android_d8_jar(None).expect("Failed to find d8.jar");

        assert!(
            android_build::JavaRun::new()
                .class_path(d8_jar_path)
                .main_class("com.android.tools.r8.D8")
                .arg("--classpath")
                .arg(android_jar_path)
                .arg("--output")
                .arg(&out_dir)
                .arg(&class_file)
                .run()
                .expect("failed to acquire exit status for java d8.jar invocation")
                .success(),
            "java d8.jar invocation failed"
        );
    }
}