【问题标题】:Is it possible to return an array from Java to C++ through a return value of a method?是否可以通过方法的返回值将数组从 Java 返回到 C++?
【发布时间】:2015-10-05 20:22:49
【问题描述】:

我知道可以通过本地方法将数组从 Java 传递到 C++,但在这种情况下,您必须运行 Java 代码。

我想做的是这样的:

public float[] testing2(float[] value1, int[] value2);

有没有办法从 C++ 代码中解决返回类型 float[] 的问题?如果不是,最简单的方法是什么?是否可以不必从 Java 运行代码?

编辑复制:

可能的重复不是重复,因为我要求使用本机方法以外的其他方式来访问此float[] - 但在其他问题中使用了本机方法。

【问题讨论】:

  • 为了澄清起见,您想调用一个返回类型为float[] 的方法,该方法是使用 C++ 代码用 Java 编写的。对吗?
  • 没错。我想调用一个返回类型为float[] 的方法,该方法是在 C++ 环境中用 Java 编写的。如果这不可能,那么访问此float[] 的最佳方式是什么?
  • “本地”方法是什么意思?对此的正常解释是“不在 JVM 中”,即所有 C++ 方法都是本机方法。而且我也不知道如何在不运行 Java 代码的情况下从 Java 代码返回数组。

标签: java c++ arrays java-native-interface return


【解决方案1】:

你可以使用CallObjectMethod()

前提条件:假设你有 C++

  • JNIEnv* env;
  • 全局或本地引用 obj,如您所述,它具有 Java 方法 public float[] testing2(float[] value1, int[] value2)
  • val1 是对 Java float[] 的引用
  • val2 是对 Java int[] 的引用。

那么,

jclass clazz = env->GetObjectClass(obj);
jmethodID testing2meth = env->GetMethodID(clazz, "testing2", "([F[I)[F");
jfloatArray ret = (jfloatArray)env->CallObjectMethod(obj, testing2meth, val1, val2);

那么你可以使用GetFloatArrayElements()GetFloatArrayRegion()访问ret

【讨论】:

  • 很抱歉回答迟了 - 但你能具体说明obj'的意思吗?因为我正在处理您的解决方案,但在调用 (jfloatArray)env->CallObjectMethod(obj, testing2meth, val1, val2); 时出现了一些运行时错误
  • @yiiit1 obj 指的是具有testing2() 方法的Java 对象。显示您的代码。你是如何获得obj的?
  • 我成功了,不得不使用CallStaticObjectMethod - 感谢您的帮助,这正是我正在寻找的解决方案!
  • @yiiit1 真的吗?但是在您的问题中,您没有将testing2() 声明为static...
  • 这是我一直遇到的问题,我拥有的其他两种方法也会发生 - 不管方法是否是静态的,我总是必须采用静态版本。 ..我不知道..
猜你喜欢
  • 1970-01-01
  • 2011-06-30
  • 2013-02-23
  • 2018-04-05
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 2018-04-04
  • 2014-12-14
相关资源
最近更新 更多