java - Qt for Android JNI : java. lang.NoSuchMethodError

标签 java android qt java-native-interface

我试图从 Java 获取一个字符串数组,并在我的 Qt Android C++ 中使用它(最终在我的 QML 代码中),但出现以下运行时错误(即崩溃):

W System.err: java.lang.NoSuchMethodError: no static method 
"Lcom/test/myTest/JniTest;.getSSIDList(V)[Ljava/lang/String;"

Java代码如下:

package com.test.myTest;

import java.util.ArrayList;
import java.util.List;

public class JniTest
{
    public static int fibonacci(int n)
    {
        if(n<0)
            return -1;
        else if(n==0 || n==1)
            return n;

        return fibonacci(n-1)+fibonacci(n-2);
    }

    public static String[] getSSIDList()
    {
        List<String> ssidList = new ArrayList<String>();
        ssidList.add("string 1");
        ssidList.add("string 2");

        String[] strings = new String[ssidList.size()];
        strings = ssidList.toArray(strings);//now strings is the resulting array

        return strings;
    }
}

C++ 代码是:

void AndroidInterface::test()
{    
    //qDebug() << fibonacci(4); //this works
    qDebug() << getSSIDList();  //this crashes with the error above
}

int AndroidInterface::fibonacci(int n)
{
    return QAndroidJniObject::callStaticMethod<jint>("com/test/myTest/JniTest"
                                                 , "fibonacci"
                                                 , "(I)I"
                                                 , n);
}

QStringList AndroidInterface::getSSIDList()
{
    QAndroidJniObject stringArray = QAndroidJniObject::callStaticObjectMethod("com/test/myTest/JniTest"
                                                 , "getSSIDList"
                                                 , "(V)[Ljava/lang/String;");

    jobjectArray objectArray = stringArray.object<jobjectArray>();

    QAndroidJniEnvironment qjniEnv;
    const int n = qjniEnv->GetArrayLength(objectArray);

    qDebug() << "Got jobjectArray of length:" << n; // correct

    for (int i = 0; i < n; ++i)
    {
        qDebug() << "Iteration:" << i;

        jobject element = qjniEnv->GetObjectArrayElement(objectArray, i);

        qDebug() << "Got jobject of type:" << qjniEnv->GetObjectClass(element);

        // ...

        qjniEnv->DeleteLocalRef(element);
    }

    QStringList list;
    return list;
}

当前实现getSSIDList()只有一个测试假人 body 。

我在 QML 中有一个按钮,可以调用 AndroidInterface::test()上面的代码,适用于 fibonacci()方法,但崩溃 getSSIDList()方法与上述错误。

我做错了什么?感谢您的帮助!

最佳答案

嗯,您没有为 native 方法提供正确的 JNI 签名。我们在 (V)[Ljava/lang/String; 中不需要 V,但在 ([Ljava/lang/String;)V.

手动为朴素方法构建正确的 C/C++ 签名是可能的,但很棘手,但幸运的是,您不需要这样做。

Android Studio 会在这方面为您提供帮助。

如果您的 IDE 中没有内置此功能,请使用 javah 实用程序从 Java 类中提取 header 。即使您实际上使用 Kotlin 或其他一些 JVM 兼容语言,这也有效。

请注意,javah 工具计划在下一个主要 JDK 版本中删除。该工具已被 JDK 8 中 javac 添加的 '-h' 选项取代。

关于java - Qt for Android JNI : java. lang.NoSuchMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50172819/

相关文章:

c++ - 在qt中动态添加小部件

java - 实现同一类对象之间的双向关系

android - 获取 TabLayout 选项卡的 TextView

c++ - 带有一个选项卡的 QTabBar 太宽

android - findViewById(R.id. 什么也没找到

java - Android 中使用 Retrofit 2 的 HTTP POST 请求

qt - 有没有一种更简洁的方法可以将许多不同类型的 Qt 小部件连接到同一个插槽?

java - 正则表达式区分字符串键

Javax.measure.quantity.Duration转换问题

java - 如何在 Maven 中使用源代码生成 JAR