gpt4 book ai didi

java - 有没有一种简化的方法来从 Rust 调用 Java 函数?

转载 作者:行者123 更新时间:2023-12-03 11:27:11 40 4
gpt4 key购买 nike

我对通过 jni crate 从 rust 调用 java 的理解涉及一些看起来像的样板

je.call_method(self.rimuru, "shell2Pixels", "(II[B)V", &[
JValue::from(width),
JValue::from(height),
JValue::from(rgbs.as_obj()),
])?;

我想这可以使用宏来改进。也许像

java_call_method!(self.rimuru, "shell2Pixels", (), width, height, rgbs)?;

宏将负责根据各种参数的类型构建签名字符串 (II[B)V

是否已经存在这样的东西,而我还没有发现它?我不确定是否可以使用常规宏而不是过程宏来实现它。

最佳答案

经过大量的困惑,我创建了 https://github.com/mutantbob/rust_jni_boilerplate它有一小组生成样板的过程宏。

(截至 2020 年 8 月)它是这样使用的:

struct Widget<'a> {
jni_env: &'a AttachGuard<'a>,
java_this: AutoLocal<'a,'a>,
}

impl<'a> JavaConstructible<'a> for Widget<'a>
{
fn wrap_jobject(jni_env:&'a AttachGuard<'a>, java_this: AutoLocal<'a,'a>) -> Widget<'a>
{
Widget {
jni_env,
java_this,
}
}
}

impl<'a> Widget<'a> {

// define a rust function named new
jni_constructor! { com.purplefrog.rust_callables.Widget () }
jni_constructor! { new_one=com.purplefrog.rust_callables.Widget (&str) }

jni_instance_method! { count () -> i32 }
jni_instance_method! { sumLen () -> i32 }

jni_instance_method! { add(&str) }

jni_instance_method! { echo_str=echo(&str)->String }
jni_instance_method! { echo_char=echo(char)->char }
jni_instance_method! { echo_byte=echo(i8)->i8 }
jni_instance_method! { echo_short=echo(i16)->i16 }
jni_instance_method! { echo_int=echo(i32)->i32 }
jni_instance_method! { echo_long=echo(i64)->i64 }

jni_instance_method! { to_strings = toStrings() ->Vec<String> }
}

它的类型支持可能存在漏洞。它的架构在开发过程中发生了巨大的变化。我什至不确定我是否在惯用地使用过程宏 API。它所基于的 jni crate 很难被认为是安全的(当您从 rust 调用 java 时,非常很容易泄漏内存)。但我已经设法让它适用于我的有限用例。

我希望它能激励其他人做得更好。在有人写出合适的文章之前,它可能会作为如何编写过程宏的示例有用(谷歌搜索并没有给我任何关于它的好文章)。

关于java - 有没有一种简化的方法来从 Rust 调用 Java 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63080035/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com