gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:17:25 24 4
gpt4 key购买 nike

我试图从 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/

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