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