From 77cde28956e41b1d42e927ca6e06d34c17d9df89 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:43:33 +0200 Subject: [PATCH 1/5] update dep --- app/src/main/rust/Cargo.lock | 157 ++++++++++++----------------------- app/src/main/rust/Cargo.toml | 2 +- 2 files changed, 55 insertions(+), 104 deletions(-) diff --git a/app/src/main/rust/Cargo.lock b/app/src/main/rust/Cargo.lock index a9bbd1d7..fcac4e09 100644 --- a/app/src/main/rust/Cargo.lock +++ b/app/src/main/rust/Cargo.lock @@ -84,12 +84,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - [[package]] name = "cfg-if" version = "1.0.4" @@ -309,7 +303,7 @@ dependencies = [ "bstr", "gix-trace", "gix-validate", - "thiserror 2.0.18", + "thiserror", ] [[package]] @@ -327,7 +321,7 @@ dependencies = [ "bstr", "gix-path", "percent-encoding", - "thiserror 2.0.18", + "thiserror", ] [[package]] @@ -471,25 +465,52 @@ dependencies = [ [[package]] name = "jni" -version = "0.21.1" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" dependencies = [ - "cesu8", "cfg-if", "combine", + "jni-macros", "jni-sys", "log", - "thiserror 1.0.69", + "simd_cesu8", + "thiserror", "walkdir", - "windows-sys 0.45.0", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.111", ] [[package]] name = "jni-sys" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.111", +] [[package]] name = "jobserver" @@ -761,6 +782,22 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +[[package]] +name = "simd_cesu8" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + [[package]] name = "smallvec" version = "1.15.1" @@ -849,33 +886,13 @@ dependencies = [ "syn 2.0.111", ] -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - [[package]] name = "thiserror" version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", + "thiserror-impl", ] [[package]] @@ -972,7 +989,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys", ] [[package]] @@ -981,15 +998,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - [[package]] name = "windows-sys" version = "0.61.2" @@ -999,63 +1007,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "wit-bindgen" version = "0.46.0" diff --git a/app/src/main/rust/Cargo.toml b/app/src/main/rust/Cargo.toml index ff850593..5c791d88 100644 --- a/app/src/main/rust/Cargo.toml +++ b/app/src/main/rust/Cargo.toml @@ -11,7 +11,7 @@ git2 = { version = "0.20.2", features = [ "vendored-libgit2", "vendored-openssl", ] } -jni = "0.21" +jni = "0.22" android_logger = "0.15" log = "0.4" rand_core = { version = "0.6", features = ["std"] } From 1953d96107d50b6ca95658a10abbfa2c4ed79b3b Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Sat, 18 Jul 2026 18:02:16 +0200 Subject: [PATCH 2/5] more --- app/src/main/rust/Cargo.lock | 7 + app/src/main/rust/Cargo.toml | 1 + app/src/main/rust/src/lib.rs | 281 ++++++++++++++++++----------------- 3 files changed, 154 insertions(+), 135 deletions(-) diff --git a/app/src/main/rust/Cargo.lock b/app/src/main/rust/Cargo.lock index fcac4e09..128e90c3 100644 --- a/app/src/main/rust/Cargo.lock +++ b/app/src/main/rust/Cargo.lock @@ -291,6 +291,7 @@ dependencies = [ "log", "rand_core", "ssh-key", + "tap", "zeroize", ] @@ -886,6 +887,12 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "thiserror" version = "2.0.18" diff --git a/app/src/main/rust/Cargo.toml b/app/src/main/rust/Cargo.toml index 5c791d88..144a999f 100644 --- a/app/src/main/rust/Cargo.toml +++ b/app/src/main/rust/Cargo.toml @@ -22,6 +22,7 @@ libgit2-sys = "0.18" include-lines = "1" gix-url = "0.35" bstr = "1.12.1" +tap = "1.0.1" [profile.release] diff --git a/app/src/main/rust/src/lib.rs b/app/src/main/rust/src/lib.rs index 5ba3c959..4bbb3f28 100644 --- a/app/src/main/rust/src/lib.rs +++ b/app/src/main/rust/src/lib.rs @@ -2,9 +2,10 @@ use std::fmt::{Debug, Display}; use anyhow::anyhow; use git2::Signature; -use jni::JNIEnv; use jni::objects::{JClass, JObject, JString, JValue}; -use jni::sys::{jboolean, jint, jobject, jstring}; +use jni::sys::{JNIEnv, jboolean, jint, jobject, jstring}; +use jni::{Env, EnvUnowned, jni_sig, jni_str}; +use tap::{Pipe, Tap}; use crate::callback::ProgressCB; use crate::key_gen::gen_keys; @@ -72,16 +73,17 @@ impl Display for Error { } #[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_initLib<'local>( - mut env: JNIEnv<'local>, - _class: JClass<'local>, - home_path: JString<'local>, +pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_initLib<'caller>( + mut env: EnvUnowned<'caller>, + _class: JClass<'caller>, + home_path: JString<'caller>, ) -> jint { - let home_path: String = env - .get_string(&home_path) - .expect("Couldn't get java string!") - .into(); + env.with_env(|env| { + Ok(home_path.mutf8_chars(env)?.to_string()) + }).into_outcome(); + + let home_path = home_path.to_string(); libgit2::init_lib(home_path); install_panic_hook(); @@ -101,30 +103,24 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_initLib< } #[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_createRepoLib<'local>( - mut env: JNIEnv<'local>, - _class: JClass<'local>, - repo_path: JString<'local>, +pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_createRepoLib<'caller>( + _env: EnvUnowned<'caller>, + _class: JClass<'caller>, + repo_path: JString<'caller>, ) -> jint { - let repo_path: String = env - .get_string(&repo_path) - .expect("Couldn't get java string!") - .into(); + let repo_path: String = repo_path.to_string(); unwrap_or_log!(libgit2::create_repo(&repo_path), "create_repo"); OK } #[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_openRepoLib<'local>( - mut env: JNIEnv<'local>, - _class: JClass<'local>, - repo_path: JString<'local>, +pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_openRepoLib<'caller>( + _env: EnvUnowned<'caller>, + _class: JClass<'caller>, + repo_path: JString<'caller>, ) -> jint { - let repo_path: String = env - .get_string(&repo_path) - .expect("Couldn't get java string!") - .into(); + let repo_path: String = repo_path.to_string(); unwrap_or_log!(libgit2::open_repo(&repo_path), "open_repo"); @@ -182,63 +178,67 @@ impl Debug for Cred { } } +macro_rules! jstring_field { + ($env:expr, $obj:expr, $field:literal) => {{ + let obj = $env + .get_field($obj, jni_str!($field), jni_sig!(JString))? + .l()?; + + $env.as_cast::(&obj)? + .mutf8_chars($env)? + .to_string() + }}; +} + +macro_rules! jstring_field_nullable { + ($env:expr, $obj:expr, $field:literal) => {{ + let obj = $env + .get_field($obj, jni_str!($field), jni_sig!(JString))? + .l()?; + + if obj.is_null() { + None + } else { + Some( + $env.as_cast::(&obj)? + .mutf8_chars($env)? + .to_string(), + ) + } + }}; +} + impl Cred { - pub fn from_jni(env: &mut JNIEnv, cred_obj: &JObject) -> anyhow::Result> { + pub fn from_jni(env: &mut Env, cred_obj: &JObject) -> anyhow::Result> { if cred_obj.is_null() { return Ok(None); } - let class = env.get_object_class(cred_obj)?; - let class_name_jstring: JString = env - .call_method(class, "getName", "()Ljava/lang/String;", &[])? - .l()? - .into(); - let class_name: String = env.get_string(&class_name_jstring)?.into(); + let class_name = { + let class = env.get_object_class(cred_obj)?; + + let obj = env + .call_method(class, jni_str!("getName"), jni_sig!(() -> JString), &[])? + .l()?; + + let jstring = env.as_cast::(&obj)?; + + jstring.mutf8_chars(env)?.to_string() + }; match class_name.as_str() { "io.github.wiiznokes.gitnote.ui.model.Cred$UserPassPlainText" => { - let username_obj: JString = env - .get_field(cred_obj, "username", "Ljava/lang/String;")? - .l()? - .into(); - let password_obj: JString = env - .get_field(cred_obj, "password", "Ljava/lang/String;")? - .l()? - .into(); - - let username: String = env.get_string(&username_obj)?.into(); - let password: String = env.get_string(&password_obj)?.into(); + let username = jstring_field!(env, cred_obj, "username"); + let password = jstring_field!(env, cred_obj, "username"); Ok(Some(Cred::UserPassPlainText { username, password })) } "io.github.wiiznokes.gitnote.ui.model.Cred$Ssh" => { - let username_key_obj: JString = env - .get_field(cred_obj, "username", "Ljava/lang/String;")? - .l()? - .into(); - - let public_key_obj: JString = env - .get_field(cred_obj, "publicKey", "Ljava/lang/String;")? - .l()? - .into(); - - let private_key_obj: JString = env - .get_field(cred_obj, "privateKey", "Ljava/lang/String;")? - .l()? - .into(); - - let passphrase_obj = env - .get_field(cred_obj, "passphrase", "Ljava/lang/String;")? - .l()?; - - let username: String = env.get_string(&username_key_obj)?.into(); - let public_key: String = env.get_string(&public_key_obj)?.into(); - let private_key: String = env.get_string(&private_key_obj)?.into(); - let passphrase: Option = if passphrase_obj.is_null() { - None - } else { - Some(env.get_string(&JString::from(passphrase_obj))?.into()) - }; + let username = jstring_field!(env, cred_obj, "username"); + let public_key = jstring_field!(env, cred_obj, "publicKey"); + + let private_key = jstring_field!(env, cred_obj, "privateKey"); + let passphrase = jstring_field_nullable!(env, cred_obj, "passphrase"); Ok(Some(Cred::Ssh { username, @@ -253,44 +253,53 @@ impl Cred { } mod callback { - use jni::{JNIEnv, objects::JObject}; + use jni::{EnvUnowned, jni_sig, jni_str, objects::JObject}; pub struct ProgressCB<'a, 'b> { - env: &'b mut JNIEnv<'a>, + env: &'b mut EnvUnowned<'a>, callback_class: JObject<'a>, } impl<'a, 'b> ProgressCB<'a, 'b> { - pub fn new(env: &'b mut JNIEnv<'a>, callback_class: JObject<'a>) -> Self { + pub fn new(env: &'b mut EnvUnowned<'a>, callback_class: JObject<'a>) -> Self { Self { env, callback_class, } } pub fn progress(&mut self, progress: i32) -> bool { - match self.env.call_method( - &self.callback_class, - "progressCb", - "(I)Z", - &[progress.into()], - ) { - Ok(res) => res.z().unwrap(), - Err(e) => { + let res: jni::EnvOutcome<'_, _, anyhow::Error> = self.env.with_env(|env| { + let res = env.call_method( + &self.callback_class, + jni_str!("progressCb"), + jni_sig!((jint) -> jboolean), + &[progress.into()], + )?; + + let res = res.z()?; + + Ok(res) + }); + + match res.into_outcome() { + jni::Outcome::Ok(bool) => bool, + jni::Outcome::Err(e) => { error!("{e}"); true } + jni::Outcome::Panic(_any) => true, } } } } #[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_cloneRepoLib<'local>( - mut env: JNIEnv<'local>, - _class: JClass<'local>, - repo_path: JString<'local>, - remote_url: JString<'local>, - cred: JString<'local>, - progress_callback: JObject<'local>, +pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_cloneRepoLib<'caller>( + mut env: EnvUnowned<'caller>, + _class: JClass<'caller>, + repo_path: JString<'caller>, + remote_url: JString<'caller>, + cred: JString<'caller>, + progress_callback: JObject<'caller>, ) -> jint { let repo_path: String = env.get_string(&repo_path).unwrap().into(); let remote_url: String = env.get_string(&remote_url).unwrap().into(); @@ -314,7 +323,7 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_cloneRep } #[unsafe(no_mangle)] pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_lastCommitLib( - env: JNIEnv, + env: EnvUnowned, _class: JClass, ) -> jstring { let commit = match libgit2::last_commit() { @@ -327,12 +336,12 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_lastComm .into_raw() } #[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_commitAllLib<'local>( - mut env: JNIEnv<'local>, - _class: JClass<'local>, - name: JString<'local>, - email: JString<'local>, - message: JString<'local>, +pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_commitAllLib<'caller>( + mut env: EnvUnowned<'caller>, + _class: JClass<'caller>, + name: JString<'caller>, + email: JString<'caller>, + message: JString<'caller>, ) -> jint { let name: String = env.get_string(&name).unwrap().into(); let email: String = env.get_string(&email).unwrap().into(); @@ -345,10 +354,10 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_commitAl #[unsafe(no_mangle)] pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_currentSignatureLib< - 'local, + 'caller, >( - mut env: JNIEnv<'local>, - _class: JClass<'local>, + mut env: EnvUnowned<'caller>, + _class: JClass<'caller>, ) -> jobject { let signature = match libgit2::signature() { Some(signature) => signature, @@ -371,10 +380,10 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_currentS pair_obj.into_raw() } #[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_pushLib<'local>( - mut env: JNIEnv<'local>, - _class: JClass<'local>, - cred: JString<'local>, +pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_pushLib<'caller>( + mut env: EnvUnowned<'caller>, + _class: JClass<'caller>, + cred: JString<'caller>, ) -> jint { let cred = Cred::from_jni(&mut env, &cred).unwrap(); unwrap_or_log!(libgit2::push(cred), "push"); @@ -382,12 +391,12 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_pushLib< } #[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_pullLib<'local>( - mut env: JNIEnv<'local>, - _class: JClass<'local>, - cred: JString<'local>, - name: JString<'local>, - email: JString<'local>, +pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_pullLib<'caller>( + mut env: EnvUnowned<'caller>, + _class: JClass<'caller>, + cred: JString<'caller>, + name: JString<'caller>, + email: JString<'caller>, ) -> jint { let cred = Cred::from_jni(&mut env, &cred).unwrap(); let name: String = env.get_string(&name).unwrap().into(); @@ -399,21 +408,21 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_pullLib< #[unsafe(no_mangle)] pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_freeLib( - _env: JNIEnv, + _env: EnvUnowned, _class: JClass, ) { } #[unsafe(no_mangle)] pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_closeRepoLib( - _env: JNIEnv, + _env: EnvUnowned, _class: JClass, ) { libgit2::close(); } #[unsafe(no_mangle)] pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_isChangeLib( - _env: JNIEnv, + _env: EnvUnowned, _class: JClass, ) -> jint { let is_change = unwrap_or_log!(libgit2::is_change(), "is_change"); @@ -422,10 +431,12 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_isChange } #[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_getTimestampsLib<'local>( - mut env: JNIEnv<'local>, - _class: JClass<'local>, - j_map: JObject<'local>, +pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_getTimestampsLib< + 'caller, +>( + mut env: EnvUnowned<'caller>, + _class: JClass<'caller>, + j_map: JObject<'caller>, ) -> jint { let timestamps = unwrap_or_log!(libgit2::get_timestamps(), "get_timestamps"); @@ -437,9 +448,9 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_getTimes OK } -fn get_timestamps_jni<'local, 'a>( - env: &mut JNIEnv<'local>, - j_map: &JObject<'local>, +fn get_timestamps_jni<'caller, 'a>( + env: &mut EnvUnowned<'caller>, + j_map: &JObject<'caller>, timestamps: impl Iterator, ) -> Result<(), Box> { let map_class = env.get_object_class(j_map)?; @@ -479,10 +490,10 @@ fn get_timestamps_jni<'local, 'a>( #[unsafe(no_mangle)] pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_generateSshKeysLib< - 'local, + 'caller, >( - mut env: JNIEnv<'local>, - _class: JClass<'local>, + mut env: EnvUnowned<'caller>, + _class: JClass<'caller>, ) -> jobject { let keys = match gen_keys() { Ok(keys) => keys, @@ -510,11 +521,11 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_generate #[unsafe(no_mangle)] pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_MimeTypeManagerKt_extensionTypeLib< - 'local, + 'caller, >( - mut env: JNIEnv<'local>, - _class: JClass<'local>, - extension: JString<'local>, + mut env: EnvUnowned<'caller>, + _class: JClass<'caller>, + extension: JString<'caller>, ) -> jint { let extension: String = env.get_string(&extension).unwrap().into(); @@ -526,11 +537,11 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_MimeTypeManagerKt_ext #[unsafe(no_mangle)] pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_MimeTypeManagerKt_isExtensionSupported< - 'local, + 'caller, >( - mut env: JNIEnv<'local>, - _class: JClass<'local>, - extension: JString<'local>, + mut env: EnvUnowned<'caller>, + _class: JClass<'caller>, + extension: JString<'caller>, ) -> jboolean { let extension: String = env.get_string(&extension).unwrap().into(); @@ -538,10 +549,10 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_MimeTypeManagerKt_isE } #[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_getUrlInfoLib<'local>( - mut env: JNIEnv<'local>, - _class: JClass<'local>, - url: JString<'local>, +pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_getUrlInfoLib<'caller>( + mut env: EnvUnowned<'caller>, + _class: JClass<'caller>, + url: JString<'caller>, ) -> jobject { let url: String = env.get_string(&url).unwrap().into(); @@ -561,7 +572,7 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_getUrlIn .new_object( boolean_class, "(Z)V", - &[JValue::Bool(if is_ssh { 1 } else { 0 })], + &[JValue::Bool(if is_ssh { true } else { false })], ) .unwrap(); From 6a17d613c9ea09d96c8a8fcd12f0105f652d735f Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Sat, 18 Jul 2026 19:39:13 +0200 Subject: [PATCH 3/5] compile --- app/src/main/rust/Cargo.lock | 7 - app/src/main/rust/Cargo.toml | 1 - app/src/main/rust/justfile | 7 +- app/src/main/rust/src/lib.rs | 453 ++++++++++++++++++--------------- app/src/main/rust/src/utils.rs | 2 +- 5 files changed, 254 insertions(+), 216 deletions(-) diff --git a/app/src/main/rust/Cargo.lock b/app/src/main/rust/Cargo.lock index 128e90c3..fcac4e09 100644 --- a/app/src/main/rust/Cargo.lock +++ b/app/src/main/rust/Cargo.lock @@ -291,7 +291,6 @@ dependencies = [ "log", "rand_core", "ssh-key", - "tap", "zeroize", ] @@ -887,12 +886,6 @@ dependencies = [ "syn 2.0.111", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "thiserror" version = "2.0.18" diff --git a/app/src/main/rust/Cargo.toml b/app/src/main/rust/Cargo.toml index 144a999f..5c791d88 100644 --- a/app/src/main/rust/Cargo.toml +++ b/app/src/main/rust/Cargo.toml @@ -22,7 +22,6 @@ libgit2-sys = "0.18" include-lines = "1" gix-url = "0.35" bstr = "1.12.1" -tap = "1.0.1" [profile.release] diff --git a/app/src/main/rust/justfile b/app/src/main/rust/justfile index 91727526..7429459c 100644 --- a/app/src/main/rust/justfile +++ b/app/src/main/rust/justfile @@ -5,27 +5,22 @@ zip_openssl_build arch: cp -r target/{{ arch }}-linux-android/release/build/openssl-sys-*/out/openssl-build/install openssl-prebuild/{{ arch }} zip -r install.zip openssl-prebuild/{{ arch }}/install mv install.zip openssl-prebuild/{{ arch }} - pull: prettier fix fix: fmt fmt-just cargo clippy --workspace --all-features --fix --allow-dirty --allow-staged - fmt: cargo fmt --all - fmt-just: just --fmt --unstable - prettier: # install on Debian: sudo snap install node --classic # npx is the command to run npm package, node is the runtime npx prettier -w . - sortext: #!/usr/bin/env bash extension_dir=supported_extensions for f in $(ls $extension_dir 2>/dev/null); do sort $extension_dir/$f -o $extension_dir/$f echo sorted $f - done \ No newline at end of file + done diff --git a/app/src/main/rust/src/lib.rs b/app/src/main/rust/src/lib.rs index 4bbb3f28..0eb959ba 100644 --- a/app/src/main/rust/src/lib.rs +++ b/app/src/main/rust/src/lib.rs @@ -2,10 +2,9 @@ use std::fmt::{Debug, Display}; use anyhow::anyhow; use git2::Signature; -use jni::objects::{JClass, JObject, JString, JValue}; -use jni::sys::{JNIEnv, jboolean, jint, jobject, jstring}; -use jni::{Env, EnvUnowned, jni_sig, jni_str}; -use tap::{Pipe, Tap}; +use jni::objects::{JObject, JString, JValue}; +use jni::sys::{jboolean, jint}; +use jni::{Env, NativeMethod, jni_sig, jni_str, native_method}; use crate::callback::ProgressCB; use crate::key_gen::gen_keys; @@ -72,18 +71,97 @@ impl Display for Error { } } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_initLib<'caller>( - mut env: EnvUnowned<'caller>, - _class: JClass<'caller>, - home_path: JString<'caller>, -) -> jint { - - env.with_env(|env| { - Ok(home_path.mutf8_chars(env)?.to_string()) - }).into_outcome(); - - let home_path = home_path.to_string(); +const INIT_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn init_lib(home_path: JString) -> jint, +}; + +const CREATE_REPO_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn create_repo_lib(repo_path: JString) -> jint, +}; + +const OPEN_REPO_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn open_repo_lib(repo_path: JString) -> jint, +}; + +const CLONE_REPO_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn clone_repo_lib(repo_path: JString, remote_url: JString, cred: JObject, progress_callback: JObject) -> jint, +}; + +const LAST_COMMIT_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn last_commit_lib() -> JString, +}; + +const COMMIT_ALL_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn commit_all_lib(name: JString, email: JString, message: JString) -> jint, +}; + +const CURRENT_SIGNATURE_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn current_signature_lib() -> JObject, +}; + +const PUSH_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn push_lib(cred: JObject) -> jint, +}; + +const PULL_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn pull_lib(cred: JObject, name: JString, email: JString) -> jint, +}; + +const FREE_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn free_lib(), +}; + +const CLOSE_REPO_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn close_repo_lib(), +}; + +const IS_CHANGE_LIB_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn is_change_lib() -> jint, +}; + +const GET_TIMESTAMPS_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn get_timestamps_lib(j_map: JObject) -> jint, +}; + +const GENERATE_SSH_KEYS_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn generate_ssh_keys_lib() -> JObject, +}; + +const EXTENSION_TYPE_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn extension_type_lib(extension: JString) -> jint, +}; + +const IS_EXTENSION_SUPPORTED_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn is_extension_supported_lib(extension: JString) -> jboolean, +}; + +const GET_URL_INFO_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManager", + extern fn get_url_info_lib(url: JString) -> JObject, +}; + +fn init_lib<'local>( + env: &mut Env<'local>, + _this: JObject<'local>, + home_path: JString<'local>, +) -> Result { + let home_path = home_path.try_to_string(env).unwrap(); libgit2::init_lib(home_path); install_panic_hook(); @@ -99,32 +177,30 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_initLib< ), ); - OK + Ok(OK) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_createRepoLib<'caller>( - _env: EnvUnowned<'caller>, - _class: JClass<'caller>, - repo_path: JString<'caller>, -) -> jint { - let repo_path: String = repo_path.to_string(); +fn create_repo_lib<'local>( + env: &mut Env<'local>, + _this: JObject<'local>, + repo_path: JString<'local>, +) -> Result { + let repo_path = repo_path.try_to_string(env).unwrap(); unwrap_or_log!(libgit2::create_repo(&repo_path), "create_repo"); - OK + Ok(OK) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_openRepoLib<'caller>( - _env: EnvUnowned<'caller>, - _class: JClass<'caller>, - repo_path: JString<'caller>, -) -> jint { - let repo_path: String = repo_path.to_string(); +fn open_repo_lib<'local>( + env: &mut Env<'local>, + _this: JObject<'local>, + repo_path: JString<'local>, +) -> Result { + let repo_path = repo_path.try_to_string(env).unwrap(); unwrap_or_log!(libgit2::open_repo(&repo_path), "open_repo"); - OK + Ok(OK) } pub enum Cred { @@ -253,58 +329,49 @@ impl Cred { } mod callback { - use jni::{EnvUnowned, jni_sig, jni_str, objects::JObject}; + use jni::{Env, jni_sig, jni_str, objects::JObject}; - pub struct ProgressCB<'a, 'b> { - env: &'b mut EnvUnowned<'a>, - callback_class: JObject<'a>, + pub struct ProgressCB<'ptr, 'local> { + env: &'ptr mut Env<'local>, + callback_class: JObject<'local>, } - impl<'a, 'b> ProgressCB<'a, 'b> { - pub fn new(env: &'b mut EnvUnowned<'a>, callback_class: JObject<'a>) -> Self { + impl<'ptr, 'local> ProgressCB<'ptr, 'local> { + pub fn new(env: &'ptr mut Env<'local>, callback_class: JObject<'local>) -> Self { Self { env, callback_class, } } pub fn progress(&mut self, progress: i32) -> bool { - let res: jni::EnvOutcome<'_, _, anyhow::Error> = self.env.with_env(|env| { - let res = env.call_method( + let res = self + .env + .call_method( &self.callback_class, jni_str!("progressCb"), jni_sig!((jint) -> jboolean), &[progress.into()], - )?; - - let res = res.z()?; + ) + .unwrap(); - Ok(res) - }); + - match res.into_outcome() { - jni::Outcome::Ok(bool) => bool, - jni::Outcome::Err(e) => { - error!("{e}"); - true - } - jni::Outcome::Panic(_any) => true, - } + res.z().unwrap() } } } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_cloneRepoLib<'caller>( - mut env: EnvUnowned<'caller>, - _class: JClass<'caller>, - repo_path: JString<'caller>, - remote_url: JString<'caller>, - cred: JString<'caller>, - progress_callback: JObject<'caller>, -) -> jint { - let repo_path: String = env.get_string(&repo_path).unwrap().into(); - let remote_url: String = env.get_string(&remote_url).unwrap().into(); - - let cred = match Cred::from_jni(&mut env, &cred) { +fn clone_repo_lib<'local>( + env: &mut Env<'local>, + _this: JObject<'local>, + repo_path: JString<'local>, + remote_url: JString<'local>, + cred: JObject<'local>, + progress_callback: JObject<'local>, +) -> Result { + let repo_path = repo_path.try_to_string(env).unwrap(); + let remote_url = remote_url.try_to_string(env).unwrap(); + + let cred = match Cred::from_jni(env, &cred) { Ok(cred) => cred, Err(e) => { error!("Cred::from_jni: {e}"); @@ -312,156 +379,147 @@ pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_cloneRep } }; - let cb = ProgressCB::new(&mut env, progress_callback); + let cb = ProgressCB::new(env, progress_callback); unwrap_or_log!( libgit2::clone_repo(&repo_path, &remote_url, cred, cb), "clone_repo" ); - OK + Ok(OK) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_lastCommitLib( - env: EnvUnowned, - _class: JClass, -) -> jstring { +fn last_commit_lib<'local>( + env: &mut Env<'local>, + _this: JObject<'local>, +) -> Result, jni::errors::Error> { let commit = match libgit2::last_commit() { Some(commit) => commit, - None => return std::ptr::null_mut(), + None => return Ok(JString::null()), }; - env.new_string(commit) - .expect("Couldn't create Java string!") - .into_raw() + let s = env + .new_string(commit) + .expect("Couldn't create Java string!"); + + Ok(s) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_commitAllLib<'caller>( - mut env: EnvUnowned<'caller>, - _class: JClass<'caller>, - name: JString<'caller>, - email: JString<'caller>, - message: JString<'caller>, -) -> jint { - let name: String = env.get_string(&name).unwrap().into(); - let email: String = env.get_string(&email).unwrap().into(); - let message: String = env.get_string(&message).unwrap().into(); +fn commit_all_lib<'local>( + env: &mut Env<'local>, + _this: JObject<'local>, + name: JString<'local>, + email: JString<'local>, + message: JString<'local>, +) -> Result { + let name = name.try_to_string(env).unwrap(); + let email = email.try_to_string(env).unwrap(); + let message = message.try_to_string(env).unwrap(); unwrap_or_log!(libgit2::commit_all(&name, &email, &message), "commit_all"); - OK + Ok(OK) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_currentSignatureLib< - 'caller, ->( - mut env: EnvUnowned<'caller>, - _class: JClass<'caller>, -) -> jobject { +fn current_signature_lib<'local>( + env: &mut Env<'local>, + _this: JObject<'local>, +) -> Result, jni::errors::Error> { let signature = match libgit2::signature() { Some(signature) => signature, - None => return std::ptr::null_mut(), + None => return Ok(JObject::null()), }; let name_jstring = env.new_string(&signature.0).unwrap(); let email_jstring = env.new_string(&signature.1).unwrap(); - let pair_class = env.find_class("kotlin/Pair").unwrap(); + let pair_class = env.find_class(jni_str!("kotlin/Pair")).unwrap(); let pair_obj = env .new_object( &pair_class, - "(Ljava/lang/Object;Ljava/lang/Object;)V", + jni_sig!((JObject, JObject)), &[(&name_jstring).into(), (&email_jstring).into()], ) .unwrap(); - pair_obj.into_raw() + Ok(pair_obj) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_pushLib<'caller>( - mut env: EnvUnowned<'caller>, - _class: JClass<'caller>, - cred: JString<'caller>, -) -> jint { - let cred = Cred::from_jni(&mut env, &cred).unwrap(); +fn push_lib<'local>( + env: &mut Env<'local>, + _this: JObject<'local>, + cred: JObject<'local>, +) -> Result { + let cred = Cred::from_jni(env, &cred).unwrap(); unwrap_or_log!(libgit2::push(cred), "push"); - OK + Ok(OK) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_pullLib<'caller>( - mut env: EnvUnowned<'caller>, - _class: JClass<'caller>, - cred: JString<'caller>, - name: JString<'caller>, - email: JString<'caller>, -) -> jint { - let cred = Cred::from_jni(&mut env, &cred).unwrap(); - let name: String = env.get_string(&name).unwrap().into(); - let email: String = env.get_string(&email).unwrap().into(); +fn pull_lib<'local>( + env: &mut Env<'local>, + _this: JObject<'local>, + cred: JObject<'local>, + name: JString<'local>, + email: JString<'local>, +) -> Result { + let cred = Cred::from_jni(env, &cred).unwrap(); + let name: String = name.try_to_string(env).unwrap(); + let email: String = email.try_to_string(env).unwrap(); let author = GitAuthor { name, email }; unwrap_or_log!(libgit2::pull(cred, &author), "pull"); - OK + Ok(OK) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_freeLib( - _env: EnvUnowned, - _class: JClass, -) { +fn free_lib<'local>( + _env: &mut Env<'local>, + _this: JObject<'local>, +) -> Result<(), jni::errors::Error> { + Ok(()) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_closeRepoLib( - _env: EnvUnowned, - _class: JClass, -) { +fn close_repo_lib<'local>( + _env: &mut Env<'local>, + _this: JObject<'local>, +) -> Result<(), jni::errors::Error> { libgit2::close(); + Ok(()) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_isChangeLib( - _env: EnvUnowned, - _class: JClass, -) -> jint { +fn is_change_lib<'local>( + _env: &mut Env<'local>, + _this: JObject<'local>, +) -> Result { let is_change = unwrap_or_log!(libgit2::is_change(), "is_change"); - is_change as jint + Ok(is_change as jint) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_getTimestampsLib< - 'caller, ->( - mut env: EnvUnowned<'caller>, - _class: JClass<'caller>, - j_map: JObject<'caller>, -) -> jint { +fn get_timestamps_lib<'local>( + env: &mut Env<'local>, + _this: JObject<'local>, + j_map: JObject<'local>, +) -> Result { let timestamps = unwrap_or_log!(libgit2::get_timestamps(), "get_timestamps"); - if let Err(e) = get_timestamps_jni(&mut env, &j_map, timestamps.iter()) { + if let Err(e) = get_timestamps_jni(env, &j_map, timestamps.iter()) { error!("get_timestamps_jni: {e}"); - return -1; + return Ok(-1); } - OK + Ok(OK) } -fn get_timestamps_jni<'caller, 'a>( - env: &mut EnvUnowned<'caller>, - j_map: &JObject<'caller>, +fn get_timestamps_jni<'local, 'a>( + env: &mut Env<'local>, + j_map: &JObject<'local>, timestamps: impl Iterator, ) -> Result<(), Box> { let map_class = env.get_object_class(j_map)?; let put_method = env.get_method_id( map_class, - "put", - "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", + jni_str!("put"), + jni_sig!((JObject, JObject) -> JObject), )?; - let long_class = env.find_class("java/lang/Long")?; - let long_ctor = env.get_method_id(&long_class, "", "(J)V")?; + let long_class = env.find_class(jni_str!("java/lang/Long"))?; + let long_ctor = env.get_method_id(&long_class, jni_str!(""), jni_sig!((jlong)))?; for (path, timestamp) in timestamps { let j_key: JString = env.new_string(path)?; @@ -488,93 +546,86 @@ fn get_timestamps_jni<'caller, 'a>( Ok(()) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_generateSshKeysLib< - 'caller, ->( - mut env: EnvUnowned<'caller>, - _class: JClass<'caller>, -) -> jobject { +fn generate_ssh_keys_lib<'local>( + env: &mut Env<'local>, + _this: JObject<'local>, +) -> Result, jni::errors::Error> { let keys = match gen_keys() { Ok(keys) => keys, Err(e) => { error!("can't gen keys: {e}"); - return std::ptr::null_mut(); + return Ok(JObject::null()); } }; let public_jstring = env.new_string(&keys.public).unwrap(); let private_jstring = env.new_string(&keys.private).unwrap(); - let pair_class = env.find_class("kotlin/Pair").unwrap(); + let pair_class = env.find_class(jni_str!("kotlin/Pair")).unwrap(); let pair_obj = env .new_object( &pair_class, - "(Ljava/lang/Object;Ljava/lang/Object;)V", + jni_sig!((JObject, JObject)), &[(&public_jstring).into(), (&private_jstring).into()], ) .unwrap(); - pair_obj.into_raw() + Ok(pair_obj) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_MimeTypeManagerKt_extensionTypeLib< - 'caller, ->( - mut env: EnvUnowned<'caller>, - _class: JClass<'caller>, - extension: JString<'caller>, -) -> jint { - let extension: String = env.get_string(&extension).unwrap().into(); - - match mime_types::extension_type(extension.as_str()) { +fn extension_type_lib<'local>( + env: &mut Env<'local>, + _this: JObject<'local>, + extension: JString<'local>, +) -> Result { + let extension = extension.try_to_string(env).unwrap(); + + let res = match mime_types::extension_type(extension.as_str()) { Some(ext_type) => ext_type as jint, None => 0, - } + }; + + Ok(res) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_MimeTypeManagerKt_isExtensionSupported< - 'caller, ->( - mut env: EnvUnowned<'caller>, - _class: JClass<'caller>, - extension: JString<'caller>, -) -> jboolean { - let extension: String = env.get_string(&extension).unwrap().into(); - - mime_types::is_extension_supported(extension.as_str()).into() +fn is_extension_supported_lib<'local>( + env: &mut Env<'local>, + _this: JObject<'local>, + extension: JString<'local>, +) -> Result { + let extension = extension.try_to_string(env).unwrap(); + + let res = mime_types::is_extension_supported(extension.as_str()); + Ok(res) } -#[unsafe(no_mangle)] -pub extern "C" fn Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_getUrlInfoLib<'caller>( - mut env: EnvUnowned<'caller>, - _class: JClass<'caller>, - url: JString<'caller>, -) -> jobject { - let url: String = env.get_string(&url).unwrap().into(); +fn get_url_info_lib<'local>( + env: &mut Env<'local>, + _this: JObject<'local>, + url: JString<'local>, +) -> Result, jni::errors::Error> { + let url = url.try_to_string(env).unwrap(); let url_info = match url::parse_url(&url) { Ok(info) => info, Err(e) => { error!("{e}"); - return std::ptr::null_mut(); + return Ok(JObject::null()); } }; let is_ssh = url_info.kind == url::UrlKind::Ssh; - let boolean_class = env.find_class("java/lang/Boolean").unwrap(); + let boolean_class = env.find_class(jni_str!("java/lang/Boolean")).unwrap(); let obj = env .new_object( boolean_class, - "(Z)V", - &[JValue::Bool(if is_ssh { true } else { false })], + jni_sig!((jboolean)), + &[JValue::Bool(is_ssh)], ) .unwrap(); - obj.into_raw() + Ok(obj) } diff --git a/app/src/main/rust/src/utils.rs b/app/src/main/rust/src/utils.rs index 4fed6b11..8519c8db 100644 --- a/app/src/main/rust/src/utils.rs +++ b/app/src/main/rust/src/utils.rs @@ -27,7 +27,7 @@ macro_rules! unwrap_or_log { Ok(v) => v, Err(e) => { error!("{}: {}", $name, e); - return e.into(); + return Ok(e.into()); } } }; From 6c04557117146a47a602a16f4c02715b724d71f5 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Sat, 18 Jul 2026 22:04:43 +0200 Subject: [PATCH 4/5] Update lib.rs --- app/src/main/rust/src/lib.rs | 147 +++++++++++++++++------------------ 1 file changed, 71 insertions(+), 76 deletions(-) diff --git a/app/src/main/rust/src/lib.rs b/app/src/main/rust/src/lib.rs index 0eb959ba..f54969d3 100644 --- a/app/src/main/rust/src/lib.rs +++ b/app/src/main/rust/src/lib.rs @@ -2,7 +2,7 @@ use std::fmt::{Debug, Display}; use anyhow::anyhow; use git2::Signature; -use jni::objects::{JObject, JString, JValue}; +use jni::objects::{JClass, JObject, JString, JValue}; use jni::sys::{jboolean, jint}; use jni::{Env, NativeMethod, jni_sig, jni_str, native_method}; @@ -71,94 +71,95 @@ impl Display for Error { } } -const INIT_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn init_lib(home_path: JString) -> jint, +const _INIT_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn init_lib(home_path: JString) -> jint, }; -const CREATE_REPO_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn create_repo_lib(repo_path: JString) -> jint, +const _CREATE_REPO_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn create_repo_lib(repo_path: JString) -> jint, }; -const OPEN_REPO_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn open_repo_lib(repo_path: JString) -> jint, +const _OPEN_REPO_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn open_repo_lib(repo_path: JString) -> jint, }; -const CLONE_REPO_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn clone_repo_lib(repo_path: JString, remote_url: JString, cred: JObject, progress_callback: JObject) -> jint, +const _CLONE_REPO_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + export = "Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_cloneRepoLib", + static extern fn clone_repo_lib(repo_path: JString, remote_url: JString, cred: JObject, progress_callback: JObject) -> jint, }; -const LAST_COMMIT_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn last_commit_lib() -> JString, +const _LAST_COMMIT_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn last_commit_lib() -> JString, }; -const COMMIT_ALL_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn commit_all_lib(name: JString, email: JString, message: JString) -> jint, +const _COMMIT_ALL_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn commit_all_lib(name: JString, email: JString, message: JString) -> jint, }; -const CURRENT_SIGNATURE_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn current_signature_lib() -> JObject, +const _CURRENT_SIGNATURE_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn current_signature_lib() -> JObject, }; -const PUSH_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn push_lib(cred: JObject) -> jint, +const _PUSH_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn push_lib(cred: JObject) -> jint, }; -const PULL_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn pull_lib(cred: JObject, name: JString, email: JString) -> jint, +const _PULL_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn pull_lib(cred: JObject, name: JString, email: JString) -> jint, }; -const FREE_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn free_lib(), +const _FREE_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn free_lib(), }; -const CLOSE_REPO_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn close_repo_lib(), +const _CLOSE_REPO_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn close_repo_lib(), }; -const IS_CHANGE_LIB_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn is_change_lib() -> jint, +const _IS_CHANGE_LIB_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn is_change_lib() -> jint, }; -const GET_TIMESTAMPS_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn get_timestamps_lib(j_map: JObject) -> jint, +const _GET_TIMESTAMPS_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn get_timestamps_lib(j_map: JObject) -> jint, }; -const GENERATE_SSH_KEYS_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn generate_ssh_keys_lib() -> JObject, +const _GENERATE_SSH_KEYS_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn generate_ssh_keys_lib() -> JObject, }; -const EXTENSION_TYPE_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn extension_type_lib(extension: JString) -> jint, +const _EXTENSION_TYPE_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn extension_type_lib(extension: JString) -> jint, }; -const IS_EXTENSION_SUPPORTED_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn is_extension_supported_lib(extension: JString) -> jboolean, +const _IS_EXTENSION_SUPPORTED_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn is_extension_supported_lib(extension: JString) -> jboolean, }; -const GET_URL_INFO_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManager", - extern fn get_url_info_lib(url: JString) -> JObject, +const _GET_URL_INFO_LIB_METHOD: NativeMethod = native_method! { + java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + static extern fn get_url_info_lib(url: JString) -> JObject, }; fn init_lib<'local>( env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, home_path: JString<'local>, ) -> Result { let home_path = home_path.try_to_string(env).unwrap(); @@ -182,7 +183,7 @@ fn init_lib<'local>( fn create_repo_lib<'local>( env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, repo_path: JString<'local>, ) -> Result { let repo_path = repo_path.try_to_string(env).unwrap(); @@ -193,7 +194,7 @@ fn create_repo_lib<'local>( } fn open_repo_lib<'local>( env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, repo_path: JString<'local>, ) -> Result { let repo_path = repo_path.try_to_string(env).unwrap(); @@ -354,15 +355,13 @@ mod callback { ) .unwrap(); - - res.z().unwrap() } } } fn clone_repo_lib<'local>( env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, repo_path: JString<'local>, remote_url: JString<'local>, cred: JObject<'local>, @@ -390,7 +389,7 @@ fn clone_repo_lib<'local>( } fn last_commit_lib<'local>( env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, ) -> Result, jni::errors::Error> { let commit = match libgit2::last_commit() { Some(commit) => commit, @@ -405,7 +404,7 @@ fn last_commit_lib<'local>( } fn commit_all_lib<'local>( env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, name: JString<'local>, email: JString<'local>, message: JString<'local>, @@ -421,7 +420,7 @@ fn commit_all_lib<'local>( fn current_signature_lib<'local>( env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, ) -> Result, jni::errors::Error> { let signature = match libgit2::signature() { Some(signature) => signature, @@ -445,7 +444,7 @@ fn current_signature_lib<'local>( } fn push_lib<'local>( env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, cred: JObject<'local>, ) -> Result { let cred = Cred::from_jni(env, &cred).unwrap(); @@ -455,7 +454,7 @@ fn push_lib<'local>( fn pull_lib<'local>( env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, cred: JObject<'local>, name: JString<'local>, email: JString<'local>, @@ -470,21 +469,21 @@ fn pull_lib<'local>( fn free_lib<'local>( _env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, ) -> Result<(), jni::errors::Error> { Ok(()) } fn close_repo_lib<'local>( _env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, ) -> Result<(), jni::errors::Error> { libgit2::close(); Ok(()) } fn is_change_lib<'local>( _env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, ) -> Result { let is_change = unwrap_or_log!(libgit2::is_change(), "is_change"); @@ -493,7 +492,7 @@ fn is_change_lib<'local>( fn get_timestamps_lib<'local>( env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, j_map: JObject<'local>, ) -> Result { let timestamps = unwrap_or_log!(libgit2::get_timestamps(), "get_timestamps"); @@ -548,7 +547,7 @@ fn get_timestamps_jni<'local, 'a>( fn generate_ssh_keys_lib<'local>( env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, ) -> Result, jni::errors::Error> { let keys = match gen_keys() { Ok(keys) => keys, @@ -576,7 +575,7 @@ fn generate_ssh_keys_lib<'local>( fn extension_type_lib<'local>( env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, extension: JString<'local>, ) -> Result { let extension = extension.try_to_string(env).unwrap(); @@ -591,7 +590,7 @@ fn extension_type_lib<'local>( fn is_extension_supported_lib<'local>( env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, extension: JString<'local>, ) -> Result { let extension = extension.try_to_string(env).unwrap(); @@ -602,7 +601,7 @@ fn is_extension_supported_lib<'local>( fn get_url_info_lib<'local>( env: &mut Env<'local>, - _this: JObject<'local>, + _class: JClass<'local>, url: JString<'local>, ) -> Result, jni::errors::Error> { let url = url.try_to_string(env).unwrap(); @@ -620,11 +619,7 @@ fn get_url_info_lib<'local>( let boolean_class = env.find_class(jni_str!("java/lang/Boolean")).unwrap(); let obj = env - .new_object( - boolean_class, - jni_sig!((jboolean)), - &[JValue::Bool(is_ssh)], - ) + .new_object(boolean_class, jni_sig!((jboolean)), &[JValue::Bool(is_ssh)]) .unwrap(); Ok(obj) From 7e08a0381510914a422fa656f0f027097c153293 Mon Sep 17 00:00:00 2001 From: wiiznokes <78230769+wiiznokes@users.noreply.github.com> Date: Sat, 18 Jul 2026 22:23:56 +0200 Subject: [PATCH 5/5] f --- .../java/io/github/wiiznokes/gitnote/data/room/Dao.kt | 4 ++-- .../wiiznokes/gitnote/manager/MimeTypeManager.kt | 2 +- app/src/main/rust/src/lib.rs | 10 ++++++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/data/room/Dao.kt b/app/src/main/java/io/github/wiiznokes/gitnote/data/room/Dao.kt index 74fd2c6c..09f275f2 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/data/room/Dao.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/data/room/Dao.kt @@ -11,7 +11,7 @@ import androidx.sqlite.db.SimpleSQLiteQuery import androidx.sqlite.db.SupportSQLiteQuery import io.github.wiiznokes.gitnote.data.platform.NodeFs import io.github.wiiznokes.gitnote.manager.Progress -import io.github.wiiznokes.gitnote.manager.isExtensionSupported +import io.github.wiiznokes.gitnote.manager.isExtensionSupportedLib import io.github.wiiznokes.gitnote.ui.model.GridNote import io.github.wiiznokes.gitnote.ui.model.SortOrder import io.github.wiiznokes.gitnote.ui.screen.app.DrawerFolderModel @@ -52,7 +52,7 @@ interface RepoDatabaseDao { when (nodeFs) { is NodeFs.File -> { - if (!isExtensionSupported(nodeFs.extension.text)) { + if (!isExtensionSupportedLib(nodeFs.extension.text)) { //Log.d(TAG, "skipped ${nodeFs.path} because extension not supported") return@forEachNodeFs } diff --git a/app/src/main/java/io/github/wiiznokes/gitnote/manager/MimeTypeManager.kt b/app/src/main/java/io/github/wiiznokes/gitnote/manager/MimeTypeManager.kt index d88aa6f0..ef210282 100644 --- a/app/src/main/java/io/github/wiiznokes/gitnote/manager/MimeTypeManager.kt +++ b/app/src/main/java/io/github/wiiznokes/gitnote/manager/MimeTypeManager.kt @@ -21,4 +21,4 @@ private fun extensionTypeFromNumber(num: Int): ExtensionType? = private external fun extensionTypeLib(extension: String): Int -external fun isExtensionSupported(extension: String): Boolean \ No newline at end of file +external fun isExtensionSupportedLib(extension: String): Boolean \ No newline at end of file diff --git a/app/src/main/rust/src/lib.rs b/app/src/main/rust/src/lib.rs index f54969d3..499fada4 100644 --- a/app/src/main/rust/src/lib.rs +++ b/app/src/main/rust/src/lib.rs @@ -104,16 +104,19 @@ const _COMMIT_ALL_LIB_METHOD: NativeMethod = native_method! { const _CURRENT_SIGNATURE_LIB_METHOD: NativeMethod = native_method! { java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + export = "Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_currentSignatureLib", static extern fn current_signature_lib() -> JObject, }; const _PUSH_LIB_METHOD: NativeMethod = native_method! { java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + export = "Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_pushLib", static extern fn push_lib(cred: JObject) -> jint, }; const _PULL_LIB_METHOD: NativeMethod = native_method! { java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + export = "Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_pullLib", static extern fn pull_lib(cred: JObject, name: JString, email: JString) -> jint, }; @@ -134,26 +137,29 @@ const _IS_CHANGE_LIB_LIB_METHOD: NativeMethod = native_method! { const _GET_TIMESTAMPS_LIB_METHOD: NativeMethod = native_method! { java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + export = "Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_getTimestampsLib", static extern fn get_timestamps_lib(j_map: JObject) -> jint, }; const _GENERATE_SSH_KEYS_LIB_METHOD: NativeMethod = native_method! { java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + export = "Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_generateSshKeysLib", static extern fn generate_ssh_keys_lib() -> JObject, }; const _EXTENSION_TYPE_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + java_type = "io.github.wiiznokes.gitnote.manager.MimeTypeManagerKt", static extern fn extension_type_lib(extension: JString) -> jint, }; const _IS_EXTENSION_SUPPORTED_LIB_METHOD: NativeMethod = native_method! { - java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + java_type = "io.github.wiiznokes.gitnote.manager.MimeTypeManagerKt", static extern fn is_extension_supported_lib(extension: JString) -> jboolean, }; const _GET_URL_INFO_LIB_METHOD: NativeMethod = native_method! { java_type = "io.github.wiiznokes.gitnote.manager.GitManagerKt", + export = "Java_io_github_wiiznokes_gitnote_manager_GitManagerKt_getUrlInfoLib", static extern fn get_url_info_lib(url: JString) -> JObject, };