fix rustPointerInput jni parameter declaration, call new_string in with_local_frame (#8266)

Signed-off-by: 21pages <sunboeasy@gmail.com>
This commit is contained in:
21pages 2024-06-05 18:09:01 +08:00 committed by GitHub
parent a84b9bd2c8
commit bd51afe86c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 50 additions and 38 deletions

View File

@ -227,7 +227,7 @@ pub fn clear_codec_info() {
)?; )?;
Ok(JObject::null()) Ok(JObject::null())
})?; })?;
*/ */
pub fn call_main_service_pointer_input(kind: &str, mask: i32, x: i32, y: i32) -> JniResult<()> { pub fn call_main_service_pointer_input(kind: &str, mask: i32, x: i32, y: i32) -> JniResult<()> {
if let (Some(jvm), Some(ctx)) = ( if let (Some(jvm), Some(ctx)) = (
JVM.read().unwrap().as_ref(), JVM.read().unwrap().as_ref(),
@ -238,7 +238,7 @@ pub fn call_main_service_pointer_input(kind: &str, mask: i32, x: i32, y: i32) ->
env.call_method( env.call_method(
ctx, ctx,
"rustPointerInput", "rustPointerInput",
"(Ljava/lang/String;III)V", "(IIII)V",
&[ &[
JValue::Int(kind), JValue::Int(kind),
JValue::Int(mask), JValue::Int(mask),
@ -278,19 +278,22 @@ pub fn call_main_service_get_by_name(name: &str) -> JniResult<String> {
MAIN_SERVICE_CTX.read().unwrap().as_ref(), MAIN_SERVICE_CTX.read().unwrap().as_ref(),
) { ) {
let mut env = jvm.attach_current_thread_as_daemon()?; let mut env = jvm.attach_current_thread_as_daemon()?;
let name = env.new_string(name)?; let res = env.with_local_frame(10, |env| -> JniResult<String> {
let res = env let name = env.new_string(name)?;
.call_method( let res = env
ctx, .call_method(
"rustGetByName", ctx,
"(Ljava/lang/String;)Ljava/lang/String;", "rustGetByName",
&[JValue::Object(&JObject::from(name))], "(Ljava/lang/String;)Ljava/lang/String;",
)? &[JValue::Object(&JObject::from(name))],
.l()?; )?
let res = JString::from(res); .l()?;
let res = env.get_string(&res)?; let res = JString::from(res);
let res = res.to_string_lossy().to_string(); let res = env.get_string(&res)?;
return Ok(res); let res = res.to_string_lossy().to_string();
Ok(res)
})?;
Ok(res)
} else { } else {
return Err(JniError::ThrowFailed(-1)); return Err(JniError::ThrowFailed(-1));
} }
@ -306,20 +309,23 @@ pub fn call_main_service_set_by_name(
MAIN_SERVICE_CTX.read().unwrap().as_ref(), MAIN_SERVICE_CTX.read().unwrap().as_ref(),
) { ) {
let mut env = jvm.attach_current_thread_as_daemon()?; let mut env = jvm.attach_current_thread_as_daemon()?;
let name = env.new_string(name)?; env.with_local_frame(10, |env| -> JniResult<()> {
let arg1 = env.new_string(arg1.unwrap_or(""))?; let name = env.new_string(name)?;
let arg2 = env.new_string(arg2.unwrap_or(""))?; let arg1 = env.new_string(arg1.unwrap_or(""))?;
let arg2 = env.new_string(arg2.unwrap_or(""))?;
env.call_method( env.call_method(
ctx, ctx,
"rustSetByName", "rustSetByName",
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
&[ &[
JValue::Object(&JObject::from(name)), JValue::Object(&JObject::from(name)),
JValue::Object(&JObject::from(arg1)), JValue::Object(&JObject::from(arg1)),
JValue::Object(&JObject::from(arg2)), JValue::Object(&JObject::from(arg2)),
], ],
)?; )?;
Ok(())
})?;
return Ok(()); return Ok(());
} else { } else {
return Err(JniError::ThrowFailed(-1)); return Err(JniError::ThrowFailed(-1));

View File

@ -2180,7 +2180,8 @@ pub fn session_request_new_display_init_msgs(session_id: SessionID, display: usi
pub mod server_side { pub mod server_side {
use hbb_common::{config, log}; use hbb_common::{config, log};
use jni::{ use jni::{
objects::{JClass, JString}, errors::{Error as JniError, Result as JniResult},
objects::{JClass, JObject, JString},
sys::jstring, sys::jstring,
JNIEnv, JNIEnv,
}; };
@ -2223,15 +2224,20 @@ pub mod server_side {
input: JString, input: JString,
) -> jstring { ) -> jstring {
let mut env = env; let mut env = env;
let res = if let (Ok(input), Ok(locale)) = (env.get_string(&input), env.get_string(&locale)) let res =
{ env.with_local_frame_returning_local(10, |env: &mut JNIEnv| -> JniResult<JObject> {
let input: String = input.into(); let res = if let (Ok(input), Ok(locale)) =
let locale: String = locale.into(); (env.get_string(&input), env.get_string(&locale))
crate::client::translate_locale(input, &locale) {
} else { let input: String = input.into();
"".into() let locale: String = locale.into();
}; crate::client::translate_locale(input, &locale)
return env.new_string(res).unwrap_or(input).into_raw(); } else {
"".into()
};
env.new_string(res).map(|v| v.into())
});
res.unwrap_or(input.into()).into_raw()
} }
#[no_mangle] #[no_mangle]