0

我对Qt相当陌生,我正在尝试做一些 Android 开发。我正在使用 Qt 并使用QAndroidJNIEnvironment。在代码中,我使用QMetaObject::invokeMethod调用 QMainWindow 标头中的插槽来实现我的本机方法。问题是java文件中的native方法有一个参数是java整数数组(我相信QAndroindJniObject中的等效类型是jintArray)。我找不到相应的 c++/Qt 类型来放置在 Q_ARG(type, value) 宏中以解析参数。请帮助我理解我做错了什么,因为我认为 jintArray 的等效类型是 int [],但是当我使用它时我收到错误。在此先感谢您的帮助。

onReceiveNativeMounted (JNIEnv * env, jobject obj,jint array_index,jintArray version)
{

QMetaObject::invokeMethod(&MainWindow::instance(), "onReceiveMounted"
                          , Qt::QueuedConnection, Q_ARG(int, array_index),Q_ARG(int[], version));

 return array_index;
}

我收到的错误如下:

error: no matching function for call to 
'QArgument<int []>::QArgument(const char [6], _jarray*&)'
 #define Q_ARG(type, data) QArgument<type >(#type, data)
                                                       ^

根据要求,java 函数签名如下:

public static native int onReceiveNativeMounted(int array_index, int[] version);
4

1 回答 1

1

您需要根据 JNI API 访问 java 数组。最简单的方法是将数据转换为QVector. 您需要复制 Java 数组,因为它的生命周期不在您的控制之下(除非您希望它是这样,但这会使生活变得比它需要的要困难得多)。

QVector toQVector(JNIEnv * env, jintArray arr) {
  auto len = (*env)->GetArrayLength(env, arr);
  QVector result(len);
  auto data = (*env)->GetIntArrayElements(env, arr, 0);
  for (int i = 0; i < len; ++i)
    result[i] = data[i];
  (*env)->ReleaseIntArrayElements(env, arr, data, 0);
  return result;
}

直接从仿函数执行调用比通过invokeMethod. 函子可以捕获向量:

int onReceiveNativeMounted (JNIEnv * env, jobject obj, jint array_index, jintArray version)
{
  auto window = &MainWindow::instance();
  auto vector = toQVector(env, version);
  QObject sig;
  sig.connect(&sig, &QObject::destroyed, window, [=]{
    window->onReceiveMounted(array_index, vector.data());
  }, Qt::QueuedConnection);
  return array_index;
}
于 2015-09-18T20:02:13.703 回答