【问题标题】:Putting JNI primitive types into same array将 JNI 原始类型放入同一个数组中
【发布时间】:2014-08-18 21:06:40
【问题描述】:

我正在尝试编写带有给定参数、搜索和调用 Method 的静态 Java 方法。

这个方法应该有可变数量的参数,并且必须从 C++ 中调用。 我尝试了几个选项,但我无法完成它。这甚至可能吗?

到目前为止,我可以存储它包含的类型和位置,并且可以将 jobject 和 jstring 放在同一个数组中。

如果这是不可能的,是否可以通过 Java 的反射来引用从 JNI 中找到的方法 ID,或者以某种方式将引用传递给 long 对象。这样的结构是可以的,因为我可以将 64 位整数转换为其他所有内容。

【问题讨论】:

  • 我认为run-time type information 是可能的。
  • 我认为 RTTI 在 android native 中被禁用不确定。
  • 请编辑您的问题以指定android!

标签: java android object casting java-native-interface


【解决方案1】:

如果您在 JNI 中需要该数组,请使用 jvalue 联合类型作为您的数组类型。例如:jvalue myArray* = { (jint) 1, (jlong​​) 1000, (jboolean) false }

Java 不支持 jvalue 也不支持可变参数函数,因此,如果您需要将原始数组从 Java 传递给 JNI 作为解决限制的方法,您应该使用带有原始对象包装器(如 java)的 Object 数组.lang.Integer 并根据 JNI 中的类型调用值函数。有可能,只是实施起来很痛苦。

【讨论】:

  • 如此多的单次执行调用的复杂性是多少?可以启动所有这些对象吗?
  • 它不会太慢,为什么不会呢?在 JNI 中实现它的麻烦在于迭代数组,然后调用 IsInstanceOf,然后进行一些类和方法查找。在找到 objInteger.intValue() 之类的方法 id 后,您将调用该方法来获取所需的 jprimitive。
  • 谢谢,我有一定的办法。我将这 9 个类存储为全局引用和构造函数方法 ID,并使用对象数组。仍然无法正确测试,但如果有人遇到类似问题,请在此处报告。
猜你喜欢
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 2020-07-02
相关资源
最近更新 更多