gpt4 book ai didi

performance - JNI - 将表示基本 Java 对象( bool )的作业转换为 native 基本类型( bool )

转载 作者:行者123 更新时间:2023-12-04 03:28:41 25 4
gpt4 key购买 nike

我想我设法将大部分问题都放在了这个标题中!

我在 native C++ 代码中从 Java 中提取一个对象:

jobject valueObject = env->CallObjectMethod(hashMapObject, hashMapGetMID, keyObject);

我可以使用以下内容检查返回对象是否是 native 类型之一:
jclass boolClass = env->FindClass("java/lang/Boolean");
if(env->IsInstanceOf(valueObject, boolClass) == JNI_TRUE) { }

所以,我现在有一个我知道是 bool 值的 jobject(注意大写 B) - 问题是,将它转换为 bool 的最有效方法是什么(考虑到我的 native 代码中已经有了 jobject)。类型转换不起作用,这是有道理的。

虽然上面的例子是一个 bool 值,但我也想转换 Character->char、Short->short、Integer->int、Float->float、Double->double。

(一旦我实现了它,我将发布一个回答 Boolean.booleanValue())

最佳答案

你有两个选择。

选项 #1 是您在自我回答中所写的:使用为每个类定义的公共(public)方法来提取原始值。

选项 #2 更快但不严格合法:直接访问内部字段。对于 bool 值,这将是 Boolean.value。对于每个原始框类,您都有一个“值”字段的 fieldID,您只需直接读取该字段。 (JNI 很高兴地忽略了它被声明为私有(private)的事实。您还可以写入“最终”字段并执行其他属于“非常糟糕的主意”类别的事情。)

“值”字段的名称不太可能更改,因为这会破坏序列化。所以官方不建议这样做,但在实践中,如果需要,您可以摆脱它。

无论哪种方式,您都应该缓存 jmethodID/jfieldID 值,而不是每次都查找它们(查找相对昂贵)。

您还可以使用成本较低的 IsSameObject 函数而不是 IsInstanceof,因为框类是“最终的”。这需要进行额外的 GetObjectClass 调用以获取 valueObject 的类,但您只需在进行各种比较之前执行一次。

顺便说一句,小心使用“char”。在上面的示例中,您将 CallCharMethod (一个 16 位 UTF-16 值)的结果转换为一个 char (一个 8 位值)。请记住,char != jchar(除非您以某种方式配置为宽字符),long != jlong​​(除非您使用 64 位 long 进行编译)。

关于performance - JNI - 将表示基本 Java 对象( bool )的作业转换为 native 基本类型( bool ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6451701/

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