diff --git a/native/Cargo.lock b/native/Cargo.lock index dbeaab6..7712c8d 100644 --- a/native/Cargo.lock +++ b/native/Cargo.lock @@ -156,16 +156,18 @@ dependencies = [ [[package]] name = "jni" -version = "0.19.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", + "cfg-if", "combine", "jni-sys", "log", "thiserror", "walkdir", + "windows-sys", ] [[package]] @@ -374,3 +376,69 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[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-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" diff --git a/native/chromium/Cargo.toml b/native/chromium/Cargo.toml index f70a1f7..1cc832d 100644 --- a/native/chromium/Cargo.toml +++ b/native/chromium/Cargo.toml @@ -9,7 +9,7 @@ crate-type = ["rlib"] [dependencies] chromium_jni_utils = { path = "../chromium_jni_utils/" } chromium_jni_macro = { path = "../chromium_jni_macro/" } -jni = "0.19.0" +jni = "0.21.1" winapi = { version = "0.3.9", features = ["winuser", "libloaderapi"] } [features] diff --git a/native/chromium/build.rs b/native/chromium/build.rs index 0e5596a..0f2282a 100644 --- a/native/chromium/build.rs +++ b/native/chromium/build.rs @@ -193,4 +193,5 @@ fn generator(cef_path: std::path::Display) -> bindgen::Builder { .raw_line("use jni::objects::GlobalRef;") .raw_line("use jni::objects::JObject;") .raw_line("use chromium_jni_utils::jni_unwrap;") + .raw_line("use std::ops::DerefMut;") } diff --git a/native/chromium/src/cef/mod.rs b/native/chromium/src/cef/mod.rs index b27eef7..74fe0bb 100644 --- a/native/chromium/src/cef/mod.rs +++ b/native/chromium/src/cef/mod.rs @@ -16,6 +16,7 @@ use crate::ToJava; use jni::objects::GlobalRef; use jni::objects::JObject; use chromium_jni_utils::jni_unwrap; +use std::ops::DerefMut; pub mod win; pub use self::win::_cef_window_info_t; pub use self::win::_cef_main_args_t; diff --git a/native/chromium/src/cef/win.rs b/native/chromium/src/cef/win.rs index 5ce464a..e9e2e81 100644 --- a/native/chromium/src/cef/win.rs +++ b/native/chromium/src/cef/win.rs @@ -16,6 +16,7 @@ use crate::ToJava; use jni::objects::GlobalRef; use jni::objects::JObject; use chromium_jni_utils::jni_unwrap; +use std::ops::DerefMut; use crate::cef::cef_string_t; pub type DWORD = ::std::os::raw::c_ulong; diff --git a/native/chromium/src/lib.rs b/native/chromium/src/lib.rs index 84008ad..0db5e0a 100644 --- a/native/chromium/src/lib.rs +++ b/native/chromium/src/lib.rs @@ -16,7 +16,11 @@ use jni::objects::JValue; use jni::JNIEnv; impl FromJavaMember for cef::cef_base_ref_counted_t { - fn from_java_member(env: JNIEnv, object: JObject, name: &str) -> cef::cef_base_ref_counted_t { + fn from_java_member( + env: &mut JNIEnv, + object: &JObject, + name: &str, + ) -> cef::cef_base_ref_counted_t { let obj = env .get_field( object, @@ -26,114 +30,114 @@ impl FromJavaMember for cef::cef_base_ref_counted_t { .unwrap() .l() .unwrap(); - FromJava::from_java(env, obj) + FromJava::from_java(env, &obj) } } /// Allows constructing an object from a Java object pub trait ToJava<'a> { /// Constructs `Self` from the JNI object `object` - fn to_java(_env: JNIEnv<'a>, value: Self) -> JValue<'a>; + fn to_java(_env: &JNIEnv<'a>, value: Self) -> JValue<'a, 'a>; } impl<'a, T> ToJava<'a> for *mut T { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Long(value as i64) } } impl<'a, T> ToJava<'a> for *const T { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Long(value as i64) } } impl<'a> ToJava<'a> for i32 { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Int(value) } } impl<'a> ToJava<'a> for usize { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Long(value.try_into().unwrap()) } } impl<'a> ToJava<'a> for i64 { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Long(value) } } impl<'a> ToJava<'a> for f64 { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Double(value) } } impl<'a> ToJava<'a> for cef::cef_process_id_t { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Int(unsafe { std::mem::transmute(value) }) } } impl<'a> ToJava<'a> for cef::cef_cursor_type_t { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Int(unsafe { std::mem::transmute(value) }) } } impl<'a> ToJava<'a> for cef::cef_errorcode_t { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Int(unsafe { std::mem::transmute(value) }) } } impl<'a> ToJava<'a> for cef::cef_transition_type_t { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Int(unsafe { std::mem::transmute(value) }) } } impl<'a> ToJava<'a> for cef::cef_window_open_disposition_t { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Int(unsafe { std::mem::transmute(value) }) } } impl<'a> ToJava<'a> for cef::cef_log_severity_t { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Int(unsafe { std::mem::transmute(value) }) } } impl<'a> ToJava<'a> for cef::cef_event_flags_t { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Int(unsafe { std::mem::transmute(value) }) } } impl<'a> ToJava<'a> for cef::cef_termination_status_t { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Int(unsafe { std::mem::transmute(value) }) } } impl<'a> ToJava<'a> for cef::cef_focus_source_t { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Int(unsafe { std::mem::transmute(value) }) } } impl<'a> ToJava<'a> for cef::cef_jsdialog_type_t { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Int(unsafe { std::mem::transmute(value) }) } } impl<'a> ToJava<'a> for cef::cef_quick_menu_edit_state_flags_t { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Int(unsafe { std::mem::transmute(value) }) } } impl<'a> ToJava<'a> for cef::cef_preferences_type_t { - fn to_java(_env: JNIEnv, value: Self) -> JValue<'a> { + fn to_java(mut _env: &JNIEnv, value: Self) -> JValue<'a, 'a> { JValue::Int(unsafe { std::mem::transmute(value) }) } } diff --git a/native/chromium_jni/Cargo.toml b/native/chromium_jni/Cargo.toml index 4d55095..22a5dac 100644 --- a/native/chromium_jni/Cargo.toml +++ b/native/chromium_jni/Cargo.toml @@ -4,7 +4,7 @@ version = "1.0.0" edition = "2021" [dependencies] -jni = "0.19.0" +jni = "0.21.1" chromium = { path = "../chromium/" } chromium_swt = { path = "../chromium_swt/" } chromium_jni_macro = { path = "../chromium_jni_macro/" } diff --git a/native/chromium_jni/src/allocate.rs b/native/chromium_jni/src/allocate.rs index 741d70d..d4d837d 100644 --- a/native/chromium_jni/src/allocate.rs +++ b/native/chromium_jni/src/allocate.rs @@ -19,9 +19,9 @@ use jni::JNIEnv; macro_rules! jni_allocate { ($name:tt, $type:ty) => { #[jni_name($name, $type)] - pub extern "C" fn allocate(env: JNIEnv, _class: JClass, object: JObject) -> jlong { - let object: JNIWrapperType<$type> = - JNICEFCallback::jni_allocate(env, env.new_global_ref(object).unwrap()); + pub extern "C" fn allocate(env: JNIEnv, _class: JClass, object: &JObject) -> jlong { + let global_ref = env.new_global_ref(object).unwrap(); + let object: JNIWrapperType<$type> = JNICEFCallback::jni_allocate(env, global_ref); return Box::into_raw(Box::new(object)) as jlong; } }; @@ -32,7 +32,7 @@ macro_rules! jni_deallocate { ($name:tt, $type:ty) => { #[jni_name($name, $type)] pub extern "C" fn deallocate( - _env: JNIEnv, + mut _env: JNIEnv, _class: JClass, object: *mut chromium::cef::_cef_display_handler_t, ) { diff --git a/native/chromium_jni/src/swt_wrapper.rs b/native/chromium_jni/src/swt_wrapper.rs index da256d9..73403c6 100644 --- a/native/chromium_jni/src/swt_wrapper.rs +++ b/native/chromium_jni/src/swt_wrapper.rs @@ -12,9 +12,9 @@ use jni::JNIEnv; #[no_mangle] pub extern "C" fn Java_org_eclipse_set_browser_lib_ChromiumLib_memmove__Lorg_eclipse_set_browser_lib_cef_1popup_1features_1t_2J( - env: JNIEnv, + mut env: JNIEnv, _class: JClass, - destination: JObject, + destination: &JObject, source: *mut chromium::cef::_cef_popup_features_t, ) { let source_object = unsafe { *source }; @@ -53,10 +53,10 @@ pub extern "C" fn Java_org_eclipse_set_browser_lib_ChromiumLib_memmove__Lorg_ecl #[no_mangle] pub extern "C" fn Java_org_eclipse_set_browser_lib_ChromiumLib_cefswt_1function_1id( - _env: JNIEnv, + mut _env: JNIEnv, _class: JClass, arg0: jlong, - arg1: JObject, + arg1: &JObject, ) { // IMPROVE: Avoid creating this object here let mut func_st = chromium_swt::FunctionSt { diff --git a/native/chromium_jni_macro/src/derive_from_java_impl.rs b/native/chromium_jni_macro/src/derive_from_java_impl.rs index 8ae8f40..a7f4293 100644 --- a/native/chromium_jni_macro/src/derive_from_java_impl.rs +++ b/native/chromium_jni_macro/src/derive_from_java_impl.rs @@ -38,7 +38,7 @@ pub fn derive_from_java_impl(tokens: TokenStream) -> TokenStream { let modified = quote! { impl FromJava for #name { - fn from_java(env: JNIEnv, object: JObject) -> #name { + fn from_java(env: &mut JNIEnv, object: &JObject) -> #name { return #name { #(#query_parts, )* }; diff --git a/native/chromium_jni_macro/src/jni_allocate.rs b/native/chromium_jni_macro/src/jni_allocate.rs index f52de92..656cf31 100644 --- a/native/chromium_jni_macro/src/jni_allocate.rs +++ b/native/chromium_jni_macro/src/jni_allocate.rs @@ -51,8 +51,8 @@ pub fn jni_allocate(tokens: TokenStream) -> TokenStream { let modified = quote! { impl JNICEFCallback for #name { - fn jni_allocate(env: JNIEnv, object: GlobalRef) -> chromium_jni_utils::JNIWrapperType<#name> { - let class = env.get_object_class(object.as_obj()).unwrap(); + fn jni_allocate(mut env: JNIEnv, object: GlobalRef) -> chromium_jni_utils::JNIWrapperType<#name> { + let class = &env.get_object_class(object.as_obj()).unwrap(); #(#jni_callbacks)* @@ -92,7 +92,7 @@ fn build_initialization( let signature = jni_signature(field); quote! { #field_ident: match env.get_method_id(class, stringify!(#field_ident), #signature) { - Err(e) => { + Err(_e) => { // Attempting to get the method id of a method that does not exists results // in a NoSuchMethodException. As we do not want to throw this, clear the exception env.exception_clear().unwrap(); @@ -140,9 +140,8 @@ fn build_jni_callback( let retline = match result { None => quote! {}, - Some(_) => quote! { return chromium_jni_utils::FromJavaValue::from_java_value(env, result); } + Some(_) => quote! { return chromium_jni_utils::FromJavaValue::from_java_value(&env, result); } }; - let func_ident = syn::Ident::new(&format!("jni_{}", field_ident), Span::call_site()); let signature = jni_signature(field); @@ -150,8 +149,8 @@ fn build_jni_callback( /// C-Callback which calls the Java function via JNI unsafe extern "C" fn #func_ident(#args) #result_tag { let wrapper = jni_unwrap(self_); - let guard = (*wrapper).jvm.attach_current_thread().unwrap(); - let env: JNIEnv = *guard; + let mut guard = (*wrapper).jvm.attach_current_thread().unwrap(); + let env: &mut JNIEnv = guard.deref_mut(); let result = env.call_method((*wrapper).this.as_obj(), stringify!(#field_ident), #signature, &[#(#argnames, )*]).expect(stringify!(#func_ident)); #retline }; diff --git a/native/chromium_jni_macro/src/jni_wrap_impl.rs b/native/chromium_jni_macro/src/jni_wrap_impl.rs index 3bafec1..4d9dad4 100644 --- a/native/chromium_jni_macro/src/jni_wrap_impl.rs +++ b/native/chromium_jni_macro/src/jni_wrap_impl.rs @@ -56,7 +56,7 @@ pub fn jni_wrap_attr_impl(attr: TokenStream, item: TokenStream) -> TokenStream { ); let q = quote! { #[no_mangle] - pub extern fn #fname(_env: jni::JNIEnv, _class: jni::objects::JClass, #(#func_args, )*) #ret_expr { + pub unsafe extern fn #fname(mut _env: jni::JNIEnv, _class: jni::objects::JClass, #(#func_args, )*) #ret_expr { #(#param_prepare; )* #call_expr #(#param_cleanup; )* @@ -88,7 +88,7 @@ fn setup_argument( }; let arg = Ident::new(&format!("arg{}", index), Span::call_site()); let param = Ident::new(&format!("param{}", index), Span::call_site()); - let (arg_type, prepare, cleanup) = handle_arg(&arg, ¶m, ty); + let (arg_type, prepare, cleanup) = handle_arg(&arg, ty); ( // JNI Function argument: arg[index]: type @@ -110,11 +110,11 @@ fn handle_return(retn: &Option) -> (proc_macro2::TokenStream, proc_macro Some(t) => match t.as_str() { "String" => ( quote! { -> jni::sys::jstring }, - quote! { return _env.new_string(result).unwrap().into_inner(); }, + quote! { return _env.new_string(result).unwrap().into_raw(); }, ), "CStr" => ( quote! { -> jni::sys::jstring }, - quote! { return _env.new_string(result.to_str().unwrap()).unwrap().into_inner(); }, + quote! { return _env.new_string(result.to_str().unwrap()).unwrap().into_raw(); }, ), "* mut c_char" | "* const c_char" => ( quote! { -> jni::sys::jstring }, @@ -123,7 +123,7 @@ fn handle_return(retn: &Option) -> (proc_macro2::TokenStream, proc_macro return std::ptr::null_mut(); } let result = unsafe { CStr::from_ptr(result) }; - return _env.new_string(result.to_str().unwrap()).unwrap().into_inner(); + return _env.new_string(result.to_str().unwrap()).unwrap().into_raw(); }, ), "cef :: cef_string_userfree_t" => ( @@ -131,7 +131,7 @@ fn handle_return(retn: &Option) -> (proc_macro2::TokenStream, proc_macro quote! { let str: String = chromium::utils::str_from_cef(result); unsafe { cef::cef_string_userfree_utf16_free(result) }; - return _env.new_string(str).unwrap().into_inner(); + return _env.new_string(str).unwrap().into_raw(); }, ), "c_int" | "i32" => ( @@ -157,7 +157,6 @@ fn handle_return(retn: &Option) -> (proc_macro2::TokenStream, proc_macro /// result is (paramType, mapping, cleanup) fn handle_arg( arg: &Ident, - param: &Ident, ty: &Type, ) -> ( proc_macro2::TokenStream, @@ -187,20 +186,18 @@ fn handle_arg( quote! {}, ), "* const c_char" => ( - quote! { jni::objects::JString }, - quote! { _env.get_string_utf_chars(#arg).unwrap_or(std::ptr::null_mut()) }, - quote! { if !#param.is_null() { - _env.release_string_utf_chars(#arg, #param).unwrap() - }}, + quote! { &jni::objects::JString }, + quote! { _env.get_string_unchecked(#arg).map(|strs| strs.into_raw()).unwrap_or(std::ptr::null_mut()) }, + quote! {}, ), "Option < Vec < u8 > >" => ( - quote! { jni::sys::jbyteArray }, - quote! { _env.convert_byte_array(#arg).map(|arr| Some(arr)).unwrap_or(None) }, + quote! { jni::objects::JByteArray }, + quote! { _env.convert_byte_array(&#arg).map(|arr| Some(arr)).unwrap_or(None) }, quote! {}, ), "Vec < u8 >" => ( - quote! { jni::sys::jbyteArray }, - quote! { _env.convert_byte_array(#arg).unwrap() }, + quote! { jni::objects::JByteArray }, + quote! { _env.convert_byte_array(&#arg).unwrap() }, quote! {}, ), _ => { diff --git a/native/chromium_jni_utils/Cargo.toml b/native/chromium_jni_utils/Cargo.toml index bddee1a..402e519 100644 --- a/native/chromium_jni_utils/Cargo.toml +++ b/native/chromium_jni_utils/Cargo.toml @@ -4,7 +4,7 @@ version = "1.0.0" edition = "2021" [dependencies] -jni = "0.19.0" +jni = "0.21.1" [lib] crate-type = ["rlib"] diff --git a/native/chromium_jni_utils/src/lib.rs b/native/chromium_jni_utils/src/lib.rs index a38043d..b3eeef8 100644 --- a/native/chromium_jni_utils/src/lib.rs +++ b/native/chromium_jni_utils/src/lib.rs @@ -8,7 +8,7 @@ */ use jni::objects::GlobalRef; use jni::objects::JObject; -use jni::objects::JValue; +use jni::objects::JValueGen; use jni::JNIEnv; use jni::JavaVM; @@ -36,54 +36,54 @@ pub trait JNICEFCallback { /// Allows extracting an object from a Java field pub trait FromJavaMember { /// Constructs `Self` from the field `name` in the JNI object `object` - fn from_java_member(env: JNIEnv, object: JObject, name: &str) -> Self; + fn from_java_member(env: &mut JNIEnv, object: &JObject, name: &str) -> Self; } /// Allows constructing an object from a Java object pub trait FromJava { /// Constructs `Self` from the JNI object `object` - fn from_java(env: JNIEnv, object: JObject) -> Self; + fn from_java(env: &mut JNIEnv, object: &JObject) -> Self; } /// Allows constructing an object from a Java object pub trait FromJavaValue { /// Constructs `Self` from the JNI object `object` - fn from_java_value(env: JNIEnv, object: JValue) -> Self; + fn from_java_value(env: &JNIEnv, object: JValueGen) -> Self; } impl FromJavaValue for i32 { - fn from_java_value(_env: JNIEnv, object: JValue) -> Self { + fn from_java_value(mut _env: &JNIEnv, object: JValueGen) -> Self { match object { - JValue::Int(i) => i, - JValue::Byte(b) => b.into(), - JValue::Short(b) => b.into(), - JValue::Bool(b) => b.into(), + JValueGen::Int(i) => i, + JValueGen::Byte(b) => b.into(), + JValueGen::Short(b) => b.into(), + JValueGen::Bool(b) => b.into(), _ => panic!("Wrong type for from_java_value"), } } } impl FromJavaValue for i64 { - fn from_java_value(_env: JNIEnv, object: JValue) -> Self { + fn from_java_value(mut _env: &JNIEnv, object: JValueGen) -> Self { match object { - JValue::Long(l) => l, - JValue::Int(i) => i.into(), - JValue::Byte(b) => b.into(), - JValue::Short(b) => b.into(), - JValue::Bool(b) => b.into(), + JValueGen::Long(l) => l, + JValueGen::Int(i) => i.into(), + JValueGen::Byte(b) => b.into(), + JValueGen::Short(b) => b.into(), + JValueGen::Bool(b) => b.into(), _ => panic!("Wrong type for from_java_value"), } } } impl FromJavaValue for *mut T { - fn from_java_value(_env: JNIEnv, object: JValue) -> Self { + fn from_java_value(mut _env: &JNIEnv, object: JValueGen) -> Self { object.j().unwrap() as *mut T } } impl FromJavaMember for usize { - fn from_java_member(env: JNIEnv, object: JObject, name: &str) -> usize { + fn from_java_member(env: &mut JNIEnv, object: &JObject, name: &str) -> usize { // Read an integer field env .get_field(object, name, "I") @@ -96,8 +96,8 @@ impl FromJavaMember for usize { // IMPROVE: Is there a better way to generalize across an arbitrary number of function args impl FromJavaMember for Option U> { fn from_java_member( - env: JNIEnv, - object: JObject, + env: &mut JNIEnv, + object: &JObject, name: &str, ) -> Option U> { let field_value = env @@ -113,8 +113,8 @@ impl FromJavaMember for Option U> { impl FromJavaMember for Option U> { fn from_java_member( - env: JNIEnv, - object: JObject, + env: &mut JNIEnv, + object: &JObject, name: &str, ) -> Option U> { let field_value = env @@ -130,8 +130,8 @@ impl FromJavaMember for Option U> { impl FromJavaMember for Option U> { fn from_java_member( - env: JNIEnv, - object: JObject, + env: &mut JNIEnv, + object: &JObject, name: &str, ) -> Option U> { let field_value = env @@ -147,8 +147,8 @@ impl FromJavaMember for Option U> { impl FromJavaMember for Option U> { fn from_java_member( - env: JNIEnv, - object: JObject, + env: &mut JNIEnv, + object: &JObject, name: &str, ) -> Option U> { let field_value = env @@ -164,8 +164,8 @@ impl FromJavaMember for Option FromJavaMember for Option U> { fn from_java_member( - env: JNIEnv, - object: JObject, + env: &mut JNIEnv, + object: &JObject, name: &str, ) -> Option U> { let field_value = env @@ -181,8 +181,8 @@ impl FromJavaMember for Option FromJavaMember for Option U> { fn from_java_member( - env: JNIEnv, - object: JObject, + env: &mut JNIEnv, + object: &JObject, name: &str, ) -> Option U> { let field_value = env @@ -200,8 +200,8 @@ impl FromJavaMember for Option U> { fn from_java_member( - env: JNIEnv, - object: JObject, + env: &mut JNIEnv, + object: &JObject, name: &str, ) -> Option U> { let field_value = env @@ -219,8 +219,8 @@ impl FromJavaMember for Option U> { fn from_java_member( - env: JNIEnv, - object: JObject, + env: &mut JNIEnv, + object: &JObject, name: &str, ) -> Option U> { let field_value = env @@ -238,8 +238,8 @@ impl FromJavaMember for Option U> { fn from_java_member( - env: JNIEnv, - object: JObject, + env: &mut JNIEnv, + object: &JObject, name: &str, ) -> Option U> { let field_value = env @@ -257,8 +257,8 @@ impl FromJavaMember for Option U> { fn from_java_member( - env: JNIEnv, - object: JObject, + env: &mut JNIEnv, + object: &JObject, name: &str, ) -> Option U> { let field_value = env @@ -276,8 +276,8 @@ impl FromJavaMember for Option U> { fn from_java_member( - env: JNIEnv, - object: JObject, + env: &mut JNIEnv, + object: &JObject, name: &str, ) -> Option U> { let field_value = env @@ -295,8 +295,8 @@ impl FromJavaMember for Option U> { fn from_java_member( - env: JNIEnv, - object: JObject, + env: &mut JNIEnv, + object: &JObject, name: &str, ) -> Option U> { let field_value = env @@ -314,8 +314,8 @@ impl FromJavaMember for Option U> { fn from_java_member( - env: JNIEnv, - object: JObject, + env: &mut JNIEnv, + object: &JObject, name: &str, ) -> Option U> { let field_value = env diff --git a/native/chromium_swt/Cargo.toml b/native/chromium_swt/Cargo.toml index e3b609c..143374a 100644 --- a/native/chromium_swt/Cargo.toml +++ b/native/chromium_swt/Cargo.toml @@ -10,7 +10,7 @@ crate-type = ["rlib"] path = "src/lib.rs" [dependencies] -jni = "0.19.0" +jni = "0.21.1" chromium = { path = "../chromium/" } chromium_subp = { path = "../chromium_subp/" } chromium_jni_macro = { path = "../chromium_jni_macro/" } diff --git a/native/chromium_swt/src/cef_cookie.rs b/native/chromium_swt/src/cef_cookie.rs index e6432e6..c1d22ec 100644 --- a/native/chromium_swt/src/cef_cookie.rs +++ b/native/chromium_swt/src/cef_cookie.rs @@ -23,7 +23,7 @@ pub extern "C" fn Java_org_eclipse_set_browser_lib_cefswt_1cookie_1visitor_1t_ce env .new_string(value.to_str().unwrap()) .unwrap() - .into_inner() + .into_raw() } #[no_mangle] @@ -36,7 +36,7 @@ pub extern "C" fn Java_org_eclipse_set_browser_lib_cefswt_1cookie_1visitor_1t_ce env .new_string(value.to_str().unwrap()) .unwrap() - .into_inner() + .into_raw() } fn cefswt_cookie_to_java(cookie: *mut chromium::cef::_cef_cookie_t) -> *mut c_char { diff --git a/native/chromium_swt/src/cef_download_item.rs b/native/chromium_swt/src/cef_download_item.rs index 61803fc..0a0966b 100644 --- a/native/chromium_swt/src/cef_download_item.rs +++ b/native/chromium_swt/src/cef_download_item.rs @@ -27,12 +27,12 @@ pub unsafe extern "C" fn get_full_path( env .new_string(value.to_str().unwrap()) .unwrap() - .into_inner() + .into_raw() } #[jni_name("org.eclipse.set.browser.lib.cef_download_item_t")] pub unsafe extern "C" fn is_cancelled( - _env: JNIEnv, + mut _env: JNIEnv, _class: JClass, item: *mut chromium::cef::_cef_download_item_t, ) -> jboolean { @@ -41,7 +41,7 @@ pub unsafe extern "C" fn is_cancelled( #[jni_name("org.eclipse.set.browser.lib.cef_download_item_t")] pub unsafe extern "C" fn is_complete( - _env: JNIEnv, + mut _env: JNIEnv, _class: JClass, item: *mut chromium::cef::_cef_download_item_t, ) -> jboolean { @@ -59,24 +59,25 @@ pub unsafe extern "C" fn get_url( env .new_string(value.to_str().unwrap()) .unwrap() - .into_inner() + .into_raw() } #[jni_name("org.eclipse.set.browser.lib.cef_download_item_t")] pub unsafe extern "C" fn before_download_callback( - _env: JNIEnv, + mut _env: JNIEnv, _class: JClass, callback: *mut chromium::cef::_cef_before_download_callback_t, jpath: JString, ) { - let rpath = _env - .get_string_utf_chars(jpath) - .unwrap_or(std::ptr::null_mut()); + let rpath = _env.get_string_unchecked(&jpath); - let path = chromium::utils::cef_string_from_c(rpath); - (*callback).cont.unwrap()(callback, &path, 0); + let strs = match rpath { + Ok(value) => value.into_raw(), + Err(_e) => std::ptr::null_mut(), + }; - _env.release_string_utf_chars(jpath, rpath).unwrap(); + let path = chromium::utils::cef_string_from_c(strs); + (*callback).cont.unwrap()(callback, &path, 0); } #[jni_wrapper("org.eclipse.set.browser.lib.cef_download_item_t")] diff --git a/native/chromium_swt/src/lib.rs b/native/chromium_swt/src/lib.rs index ca7c2c7..09910e3 100644 --- a/native/chromium_swt/src/lib.rs +++ b/native/chromium_swt/src/lib.rs @@ -14,6 +14,7 @@ extern crate chromium; use chromium::cef; use chromium_jni_macro::{jni_name, jni_wrapper}; +use jni::objects::JString; mod app; pub mod cef_browser; @@ -307,19 +308,16 @@ pub fn cefswt_set_intptr(ptr: *mut ::std::os::raw::c_int, value: c_int) { #[jni_name("org.eclipse.set.browser.lib.ChromiumLib")] #[no_mangle] -#[allow(clippy::not_unsafe_ptr_arg_deref)] -pub extern "C" fn cefswt_cstring_to_java( - _env: jni::JNIEnv, +pub extern "C" fn cefswt_cstring_to_java<'local>( + mut _env: jni::JNIEnv<'local>, _class: jni::objects::JClass, string: *const c_char, -) -> jni::sys::jstring { +) -> JString<'local> { if string.is_null() { - return std::ptr::null_mut(); + return jni::objects::JObject::null().into(); } let string = unsafe { CStr::from_ptr(string) }; - _env.new_string(string.to_str().unwrap()) - .unwrap() - .into_inner() + _env.new_string(string.to_str().unwrap()).unwrap() } #[jni_wrapper("org.eclipse.set.browser.lib.ChromiumLib")]