将未知的Java类型转换为Rust类型

如何解决将未知的Java类型转换为Rust类型

我试图将Java中的HashMap转换为Rust,并将其转换为内部对象,以匹配数据类型和所有对象。 Java中的HashMap是HashMap<String,Object>,其中Object可以是任何数据类型,包括另一个HashMap<String,Object>

我很难确定JObject是什么类型的对象,并且在如何将JObject转换为类似JString的事情上遇到了麻烦。

如您所见,我几乎什么都没用,但是作为第一步,我只想返回StringInteger或{{1 }}(其中DateDate的字符串值)。

Date.getTime()

我认为我应该执行此操作的方式(但是如果没有请更正我)是检查static DATE_CLASS: &str = "java/util/Date"; static INTEGER_CLASS: &str = "java/lang/Integer"; static STRING_CLASS: &str = "java/lang/String"; fn get_string_value(env: &JNIEnv,obj: JObject) -> String { let ret = String::new(); if env.is_instance_of(obj,STRING_CLASS).unwrap() { let ret2 = env.call_method(obj,"toString","()Ljava/lang/String;",&[]).unwrap(); // Got a JValue- now what? } if env.is_instance_of(obj,INTEGER_CLASS).unwrap() { let ret2 = env.call_method(obj,"getTime",&[]).unwrap(); // Got a JValue- now what? } ret } 是否是这些类中任何一个的实例完全合格的路径。一旦知道它们是什么类型,就可以使用JObject在它们上调用一个方法。结果是env.call_method,它可以返回一些原始类型。

enter image description here

除非假定要返回另一个对象,否则我假设应该使用这些对象,在这种情况下,我将使用-

JValue

然后,如果需要,我可以调用另一个方法。但是据我所知,如果我愿意,我无法将其转换为JString。但是,这也是到目前为止,我知道如何使用以下方法从JString中获取锈字符串的唯一方法:

let message_ref = env.auto_local(ret2).as_obj();

我要这样做吗?

如何将JValue转换为字符串?

我是否纠正我应该使用let s: String = env.get_string(a_j_string).expect("Couldn't get java string").into(); auto_local转换为JValue的方法,这样我可以再次调用它的方法了吗?

如果我应该使用原始类型JObject来获取jchar的值-如何将其转换为toString&str

编辑:

在@Chris Jester-Young的帮助下,我能够同时使用Stringjobj_to_string函数。

jobj_to_int

解决方法

jni板条箱中,JObjectJString只是JNI的jobjectjstring的包装。您可以使用JObject特性将JString“投射”到From中。例如JString::from(my_jobject)my_jobject.into()。不过,如果完全不确定对象是否实际上是字符串,则必须先进行JNIEnv::is_instance_of检查。

对于您对JValue的问题,toString的结果是一个字符串,在JVM Universe中,它是一个对象类型,而不是原始类型。因此,您可以只使用JValue::l访问器(据我所知,您不需要使用auto_local)。由于我们知道结果是字符串,因此您可以直接将结果转换为JString(如上所述),然后调用JNIEnv::get_string获得JavaStr对象,这样您就可以使用From特性将其转换为Rust字符串。

将所有内容放在一起,我们得到以下内容(未经测试,但至少可以为我编译):

fn get_string_value(env: &JNIEnv,obj: JObject<'_>) -> Result<String> {
    let result = env.call_method(obj,"toString","()Ljava/lang/String;",&[])?.l()?;
    Ok(env.get_string(result.into())?.into())
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?